From 5516c7b9f0d981a70d03ead77abb44a97eb0bfab Mon Sep 17 00:00:00 2001 From: "burols.wang" Date: Mon, 31 Jul 2023 10:03:28 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=20(sms):sms=E7=A4=BA=E4=BE=8Bpython?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 固件版本: N 是否需要文案翻译: 是 --- network-comm/sms/sms.py | 121 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 network-comm/sms/sms.py diff --git a/network-comm/sms/sms.py b/network-comm/sms/sms.py new file mode 100644 index 0000000..4172108 --- /dev/null +++ b/network-comm/sms/sms.py @@ -0,0 +1,121 @@ +# codeing=UTF-8 +import net +import checkNet +import sms as SMS + + +class QuecSMS(): + + def __init__(self): + self.__enable_log = False + self.sms_set_enable_log() + self.sms = SMS + self.sms.setCallback(self.__SMS_Call_back) + self.message="" + + def sms_display(self): + self.__log("Get Message Loction : {}".format(self.sms.getSaveLoc())) + sms.setSaveLoc("ME", "ME", "ME") + self.__log("Get ME Message Numbers : {}".format(self.sms.getMsgNums())) + sms.setSaveLoc("SM", "SM", "SM") + self.__log("Get SM Message Numbers : {}".format(self.sms.getMsgNums())) + + def sms_set_enable_log(self,flag=True): + self.__enable_log = flag + + def __log(self,args): + if self.__enable_log: + print("QuecSMS_LOG: {}".format(args)) + + + def __SMS_Call_back(self,args): + self.__log("Get SIM Id : {}".format(args[0])) + self.__log("Get Message index : {}".format(args[1])) + self.__log("Get Message Storage : {}".format(args[2])) + + def sms_delete_user_data_head(self): + + self.message=self.message[:58]+self.message[58+2*6:] + + def sms_replace_data_index(self,index,data): + self.message = self.message[:index] + data + self.message[index+len(data):] + + # message_ref :短信参考标识,同一个标识表明为同一条短信 + # message_total_num :此条长短信总条数 + # message_seq :此条短信在长短信中的序号 + # sub_message_data :词条短信的内容 + # pdu_tye :PDU类型,bit 6标记是否包含用户报文头,长短信需要 + # sub_message_len :此条短信内容长度 + def sms_append_sub_message_data(self,data): + self.message = self.message + data + + def sms_decode_pdu_message(self): + return self.sms.decodePdu(self.message,self.sms.getPduLength(self.message)) + + def sms_get_message_info(self,index): + + message0=self.sms.searchPduMsg(index) + self.message = message0 + #获取SCA + sca_num = int(message0[0:2],16) + data_len = 2 + sca = message0[data_len:data_len+sca_num*2] + data_len = data_len+sca_num*2 + pdu_tye = int(message0[data_len:data_len+1*2],16) + + data_len = data_len+1*2 + mr = message0[data_len:data_len+1*2] + + data_len = data_len+1*2 + oa = message0[data_len:data_len+sca_num*2] + + data_len = data_len+sca_num*2 + pid = message0[data_len:data_len+1*2] + + data_len = data_len+1*2 + dcs = message0[data_len:data_len+1*2] + + data_len = data_len+1*2 + scts = message0[data_len:data_len+7*2] + data_len = data_len+7*2 + sub_message_len = int(message0[data_len:data_len+1*2],16) + data_len = data_len+1*2 + sub_message_head = message0[data_len:data_len+6*2] + data_len = data_len+6*2 + sub_message_data = message0[data_len:data_len+sub_message_len*2] + message_ref = int(sub_message_head[6:8],16) + message_total_num = int(sub_message_head[8:10],16) + message_seq = int(sub_message_head[10:12],16) + return message_ref,message_total_num,message_seq,pdu_tye,sub_message_len,sub_message_data +if __name__ == '__main__': + sms1 = QuecSMS() + sms2 = QuecSMS() + #示例中索引0 、1为长短新的第一条第二条数据,以此为例展示长短信的合并 + #长短信合并只能用PDU方式读取解码合并,TEXT方式无法判断短信顺序 + + message0=list(sms1.sms_get_message_info(0)) + message1=list(sms2.sms_get_message_info(1)) + #合成一条短信步骤 + + # 1、设置PDU_type 为用户数据不包含头信息,合成一条设置成短信内容没有头部信息 + pdu_type = "{:0>2X}".format(message0[3]&0xBF) + # pdu_type 起始位置18 + message = sms1.sms_replace_data_index(18,pdu_type) + + # 2、将后续的字串内容取出追加到第一条信息用户数据之后 + sms1.sms_append_sub_message_data(message1[5]) + + + # 3、短信长度起始位置56,修改长度为原本长度加上追加的字串长度 + message0[4]=message0[4]+message1[4] + message_len = "{:0>2X}".format(message0[4]) + sms1.sms_replace_data_index(56,message_len) + + # 4、去掉用户数据报文头 + sms1.sms_delete_user_data_head() + + # 5、解码修改后的PDU串 + message=sms1.sms_decode_pdu_message() + + print("Get meger message : {}".format(message)) + \ No newline at end of file From becb7e3d34203069c5c60a5d1cf58fcd23a324ce Mon Sep 17 00:00:00 2001 From: "burols.wang" Date: Mon, 31 Jul 2023 10:32:24 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=20(sms):=20sms=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 固件版本: N 是否需要文案翻译: 是 --- network-comm/sms/sms.py | 51 ++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/network-comm/sms/sms.py b/network-comm/sms/sms.py index 4172108..b66a142 100644 --- a/network-comm/sms/sms.py +++ b/network-comm/sms/sms.py @@ -3,7 +3,9 @@ import checkNet import sms as SMS - +#本示例演示将分开到达设备的两条长两条短信合并为一条短信 +#本例演示要求短信索引值0和短信索引值1的短信同一条长短信的内容 + class QuecSMS(): def __init__(self): @@ -39,13 +41,7 @@ def sms_delete_user_data_head(self): def sms_replace_data_index(self,index,data): self.message = self.message[:index] + data + self.message[index+len(data):] - - # message_ref :短信参考标识,同一个标识表明为同一条短信 - # message_total_num :此条长短信总条数 - # message_seq :此条短信在长短信中的序号 - # sub_message_data :词条短信的内容 - # pdu_tye :PDU类型,bit 6标记是否包含用户报文头,长短信需要 - # sub_message_len :此条短信内容长度 + def sms_append_sub_message_data(self,data): self.message = self.message + data @@ -53,10 +49,24 @@ def sms_decode_pdu_message(self): return self.sms.decodePdu(self.message,self.sms.getPduLength(self.message)) def sms_get_message_info(self,index): + """ + :param index :短信索引值 + :tyoe index :整形 + :return :元组类型 + 元组内容: + (message_ref,message_total_num,message_seq,sub_message_data,pdu_tye,sub_message_len) + + :message_ref :短信参考标识,同一个标识表明为同一条短信 + :message_total_num :此条长短信总条数 + :message_seq :此条短信在长短信中的序号 + :sub_message_data :词条短信的内容 + :pdu_tye :PDU类型,bit 6标记是否包含用户报文头,长短信需要 + :sub_message_len :此条短信内容长度 + + """ message0=self.sms.searchPduMsg(index) self.message = message0 - #获取SCA sca_num = int(message0[0:2],16) data_len = 2 sca = message0[data_len:data_len+sca_num*2] @@ -90,28 +100,33 @@ def sms_get_message_info(self,index): if __name__ == '__main__': sms1 = QuecSMS() sms2 = QuecSMS() - #示例中索引0 、1为长短新的第一条第二条数据,以此为例展示长短信的合并 - #长短信合并只能用PDU方式读取解码合并,TEXT方式无法判断短信顺序 + # 读取短信索引值0的短信内容 message0=list(sms1.sms_get_message_info(0)) - message1=list(sms2.sms_get_message_info(1)) - #合成一条短信步骤 - # 1、设置PDU_type 为用户数据不包含头信息,合成一条设置成短信内容没有头部信息 + # 读取短信索引值1的短信内容 + message1=list(sms2.sms_get_message_info(1)) + print("Get Messge 0 {}".format(message0)) + print("Get Messge 1 {}".format(message1)) + if message0[0] != message1[0]: + print("Message 0 and Message are not the content data of the same long SMS!") + exit + # 1、设置PDU_type为用户数据不包含头信息 pdu_type = "{:0>2X}".format(message0[3]&0xBF) - # pdu_type 起始位置18 + # pdu_type起始位置为18 message = sms1.sms_replace_data_index(18,pdu_type) - # 2、将后续的字串内容取出追加到第一条信息用户数据之后 + # 2、将短信索引值为1的短信的用户数据追加到短信索引值为0的用户数据后 sms1.sms_append_sub_message_data(message1[5]) - # 3、短信长度起始位置56,修改长度为原本长度加上追加的字串长度 + # 3、将短信索引值为0的短信的用户数据长度加上短信索引值为1的短信用户数据长度 + # 长度位置为56 message0[4]=message0[4]+message1[4] message_len = "{:0>2X}".format(message0[4]) sms1.sms_replace_data_index(56,message_len) - # 4、去掉用户数据报文头 + # 4、去掉短信索引值为0的短信的用户数据报文头 sms1.sms_delete_user_data_head() # 5、解码修改后的PDU串 From 97e7dcace20d020e1ad53a9144ebc56627fba048 Mon Sep 17 00:00:00 2001 From: "burols.wang" Date: Mon, 31 Jul 2023 14:50:19 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=20(sms):=20=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=9F=AD=E4=BF=A1=E8=BF=87=E9=95=BF=E5=BA=95?= =?UTF-8?q?=E5=B1=82=E4=B8=8D=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 固件版本: N 是否需要文案翻译: 是 --- network-comm/sms/sms.py | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/network-comm/sms/sms.py b/network-comm/sms/sms.py index b66a142..b624792 100644 --- a/network-comm/sms/sms.py +++ b/network-comm/sms/sms.py @@ -98,39 +98,29 @@ def sms_get_message_info(self,index): message_seq = int(sub_message_head[10:12],16) return message_ref,message_total_num,message_seq,pdu_tye,sub_message_len,sub_message_data if __name__ == '__main__': + sms0 = QuecSMS() sms1 = QuecSMS() - sms2 = QuecSMS() # 读取短信索引值0的短信内容 - message0=list(sms1.sms_get_message_info(0)) + message0=list(sms0.sms_get_message_info(0)) # 读取短信索引值1的短信内容 - message1=list(sms2.sms_get_message_info(1)) + message1=list(sms1.sms_get_message_info(1)) print("Get Messge 0 {}".format(message0)) print("Get Messge 1 {}".format(message1)) if message0[0] != message1[0]: - print("Message 0 and Message are not the content data of the same long SMS!") + print("Message 0 and Message 1 are not the content data of the same long SMS!") exit - # 1、设置PDU_type为用户数据不包含头信息 - pdu_type = "{:0>2X}".format(message0[3]&0xBF) - # pdu_type起始位置为18 - message = sms1.sms_replace_data_index(18,pdu_type) + # 解码message0的PDU串 + message0_pdu=list(sms0.sms_decode_pdu_message()) + # 解码message1的PDU串 + message1_pdu=(sms1.sms_decode_pdu_message()) - # 2、将短信索引值为1的短信的用户数据追加到短信索引值为0的用户数据后 - sms1.sms_append_sub_message_data(message1[5]) - - - # 3、将短信索引值为0的短信的用户数据长度加上短信索引值为1的短信用户数据长度 - # 长度位置为56 - message0[4]=message0[4]+message1[4] - message_len = "{:0>2X}".format(message0[4]) - sms1.sms_replace_data_index(56,message_len) - - # 4、去掉短信索引值为0的短信的用户数据报文头 - sms1.sms_delete_user_data_head() - - # 5、解码修改后的PDU串 - message=sms1.sms_decode_pdu_message() - - print("Get meger message : {}".format(message)) + # 合并短信 + #判断messge 0 和 message 1的短信序列号那个考前 + if message0[2] < message1[2]: + message_merge=message0_pdu[1]+message1_pdu[1] + else: + message_merge=message1_pdu[1]+message0_pdu[1] + print("Get Merger Message is {}".format(message_merge)) \ No newline at end of file From 2961726fea97d89eae84406b9183ce52dddff1e2 Mon Sep 17 00:00:00 2001 From: "burols.wang" Date: Wed, 9 Aug 2023 08:22:51 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=20(sms):=20sms.py=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9,=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B=E8=80=83=E8=99=91=E4=B8=8D=E5=85=A8=E9=9D=A2?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8=E4=B8=80=E4=BA=9B=E6=83=85=E5=86=B5=E4=B8=8B?= =?UTF-8?q?=E5=AE=B9=E6=98=93=E5=87=BA=E9=94=99=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 固件版本: N 是否需要文案翻译: 否 --- network-comm/sms/sms.py | 74 ++++++++++++++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 12 deletions(-) diff --git a/network-comm/sms/sms.py b/network-comm/sms/sms.py index b624792..95a9c1b 100644 --- a/network-comm/sms/sms.py +++ b/network-comm/sms/sms.py @@ -15,6 +15,21 @@ def __init__(self): self.sms.setCallback(self.__SMS_Call_back) self.message="" + def sms_deal_phone_number(self,args): + data=enumerate(args) + data_str1="" + data_str2="" + data_str3="" + for index,value in data: + if index % 2 == 0: + data_str1=data_str1+value + else: + data_str2=data_str2+value + for i in range(0,len(data_str1)): + data_str3=data_str3+data_str2[i] + data_str3=data_str3+data_str1[i] + return data_str3 + def sms_display(self): self.__log("Get Message Loction : {}".format(self.sms.getSaveLoc())) sms.setSaveLoc("ME", "ME", "ME") @@ -67,24 +82,49 @@ def sms_get_message_info(self,index): """ message0=self.sms.searchPduMsg(index) self.message = message0 - sca_num = int(message0[0:2],16) + sca_num = int(message0[0:2],16) - 1 data_len = 2 + addr_type= message0[data_len:data_len+1*2] + data_len = data_len+1*2 + sca = message0[data_len:data_len+sca_num*2] + # 电话号码高低位需要转换 + sca = self.sms_deal_phone_number(sca) + + if sca_num % 2 == 1: + print("Get SCA phone {}".format(sca[:-1])) + else: + print("Get SCA phone {}".format(sca)) + data_len = data_len+sca_num*2 + pdu_tye = int(message0[data_len:data_len+1*2],16) - data_len = data_len+1*2 - mr = message0[data_len:data_len+1*2] - + + oa_num = int(message0[data_len:data_len+1*2],16) data_len = data_len+1*2 - oa = message0[data_len:data_len+sca_num*2] - - data_len = data_len+sca_num*2 + oa_addr_type = message0[data_len:data_len+1*2] + data_len = data_len+1*2 + + if oa_num % 2 == 1: + oa_num_t = int((oa_num + 1)/2) + else: + oa_num_t = int((oa_num )/2) + + oa = message0[data_len:data_len+oa_num_t*2] + # 电话号码高低位需要转换 + oa = self.sms_deal_phone_number(oa) + + if oa_num % 2 == 1: + print("Get OA phone {}".format(oa[:-1])) + else: + print("get OA phone {}".format(oa)) + + data_len = data_len+oa_num_t*2 pid = message0[data_len:data_len+1*2] data_len = data_len+1*2 dcs = message0[data_len:data_len+1*2] - data_len = data_len+1*2 scts = message0[data_len:data_len+7*2] data_len = data_len+7*2 @@ -92,11 +132,21 @@ def sms_get_message_info(self,index): data_len = data_len+1*2 sub_message_head = message0[data_len:data_len+6*2] data_len = data_len+6*2 + + # 或短信用户数据 sub_message_data = message0[data_len:data_len+sub_message_len*2] - message_ref = int(sub_message_head[6:8],16) - message_total_num = int(sub_message_head[8:10],16) - message_seq = int(sub_message_head[10:12],16) - return message_ref,message_total_num,message_seq,pdu_tye,sub_message_len,sub_message_data + + #长短信 + if ((pdu_tye & 0x40 ) >> 6) == 1: + #长短信,处理长短信用户报文头 + message_ref = int(sub_message_head[6:8],16) + message_total_num = int(sub_message_head[8:10],16) + message_seq = int(sub_message_head[10:12],16) + return message_ref,message_total_num,message_seq,pdu_tye,sub_message_len,sub_message_data + else: + # 短短信 + return 0,1,1,pdu_tye,sub_message_len,sub_message_data + if __name__ == '__main__': sms0 = QuecSMS() sms1 = QuecSMS()