【环境准备】
1、操作系统:
<code>Windows 7 x64 SP1</code>
2、Python 版本:
<code>python-3.6.3-amd64</code>
3、第三方组件:
(1)、
<code>pip3 </code><code>install</code> <code>pyserial</code>
<code>python3 setup.py build </code><code>install</code>
【列出所有串口】
<code>#encoding: utf-8</code>
<code>#author: walker</code>
<code>#date: 2017-10-06 </code>
<code>#summary: Python 用 pyserial 列出所有串口</code>
<code>import</code> <code>serial.tools.list_ports</code>
<code># 打印所有串口名</code>
<code>def</code> <code>ListPorts():</code>
<code> </code><code>serailPortList </code><code>=</code> <code>list</code><code>(serial.tools.list_ports.comports())</code>
<code> </code><code>print</code><code>(</code><code>'serail port number: %d'</code> <code>%</code> <code>len</code><code>(serailPortList))</code>
<code> </code><code>if</code> <code>len</code><code>(serailPortList) < </code><code>1</code><code>:</code>
<code> </code><code>print</code><code>(</code><code>"Not found serail port!"</code><code>)</code>
<code> </code><code>return</code>
<code> </code>
<code> </code><code>for</code> <code>serailPort </code><code>in</code> <code>serailPortList:</code>
<code> </code><code>se </code><code>=</code> <code>serial.Serial(</code><code>list</code><code>(serailPort)[</code><code>0</code><code>], </code><code>9600</code><code>, timeout</code><code>=</code><code>9</code><code>)</code>
<code> </code><code>print</code><code>(</code><code>'serail port name:%s'</code> <code>%</code> <code>se.portstr)</code>
<code> </code><code>se.close()</code>
<code> </code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>
<code> </code><code>ListPorts()</code>
【发送纯英文(ASCII)短信】
<code>#summary: Python 调用 GSM A6,发送英文短信</code>
<code>import</code> <code>time</code>
<code>class</code> <code>MessagerEn(</code><code>object</code><code>):</code>
<code> </code><code># 构造函数,打开端口</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>): </code>
<code> </code><code>self</code><code>.sePort </code><code>=</code> <code>serial.Serial(port</code><code>=</code><code>'COM3'</code><code>, baudrate</code><code>=</code><code>19200</code><code>, bytesize</code><code>=</code><code>8</code><code>, stopbits</code><code>=</code><code>1</code><code>, timeout</code><code>=</code><code>3</code><code>)</code>
<code> </code><code>time.sleep(</code><code>3</code><code>)</code>
<code> </code><code># 析构函数,关闭端口</code>
<code> </code><code>def</code> <code>__del__(</code><code>self</code><code>): </code>
<code> </code><code>self</code><code>.sePort.close()</code>
<code> </code><code># 重新打开端口</code>
<code> </code><code>def</code> <code>reopen(</code><code>self</code><code>):</code>
<code> </code><code>print</code><code>(</code><code>'reopen ...'</code><code>)</code>
<code> </code><code># 执行指令</code>
<code> </code><code># 返回从串口读取的返回值</code>
<code> </code><code>def</code> <code>execCmd(</code><code>self</code><code>, cmd, end</code><code>=</code><code>'\r'</code><code>):</code>
<code> </code><code>cmd </code><code>=</code> <code>cmd </code><code>+</code> <code>end</code>
<code> </code><code>bCmd </code><code>=</code> <code>cmd.encode(</code><code>'ascii'</code><code>)</code>
<code> </code><code>print</code><code>(</code><code>'write:%s'</code> <code>%</code> <code>bCmd)</code>
<code> </code><code>self</code><code>.sePort.write(bCmd)</code>
<code> </code><code>response </code><code>=</code> <code>self</code><code>.sePort.readall()</code>
<code> </code><code>print</code><code>(</code><code>'read :%s'</code> <code>%</code> <code>response)</code>
<code> </code><code>print</code><code>()</code>
<code> </code><code>return</code> <code>response</code>
<code> </code><code># 发送英文短信</code>
<code> </code><code># 正确返回 True;错误返回 False</code>
<code> </code><code>def</code> <code>__sendMessageEn(</code><code>self</code><code>, phoneNumber, message):</code>
<code> </code><code>if</code> <code>not</code> <code>self</code><code>.execCmd(</code><code>'AT+CMGF=1'</code><code>).endswith(b</code><code>'\r\nOK\r\n'</code><code>): </code><code>#设置TEXT MODE</code>
<code> </code><code>return</code> <code>False</code>
<code> </code>
<code> </code><code>if</code> <code>not</code> <code>self</code><code>.execCmd(</code><code>'AT+CSCS="GSM"'</code><code>).endswith(b</code><code>'\r\nOK\r\n'</code><code>): </code>
<code> </code><code>if</code> <code>not</code> <code>self</code><code>.execCmd(</code><code>'AT+CMGS="%s"'</code> <code>%</code> <code>phoneNumber).endswith(b</code><code>'\r\n> '</code><code>): </code>
<code> </code><code>if</code> <code>not</code> <code>self</code><code>.execCmd(message </code><code>+</code> <code>'\x1A'</code><code>, end</code><code>=</code><code>'</code><code>').endswith(b'</code><code>\r\nOK\r\n'): </code><code># 十六进制的1A为结束符</code>
<code> </code><code>return</code> <code>True</code>
<code> </code><code># 调用私有方法 __sendMessageEn</code>
<code> </code><code># 在失败时重新打开串口</code>
<code> </code><code>def</code> <code>sendMessage(</code><code>self</code><code>, phoneNumber, message):</code>
<code> </code><code>for</code> <code>_ </code><code>in</code> <code>range</code><code>(</code><code>0</code><code>, </code><code>3</code><code>):</code>
<code> </code><code>if</code> <code>self</code><code>.__sendMessageEn(phoneNumber, message):</code>
<code> </code><code>break</code>
<code> </code><code>self</code><code>.reopen()</code>
<code> </code><code>messagerEn </code><code>=</code> <code>MessagerEn()</code>
<code> </code><code>messagerEn.sendMessage(</code><code>'18688754379'</code><code>, </code><code>'xxx'</code><code>)</code>
<code> </code><code>messagerEn.sendMessage(</code><code>'18688754379'</code><code>, </code><code>'zzz'</code><code>)</code>
【发送中文(Unicode)短信】
<code>#summary: Python 调用 GSM A6,发送中文(Unicode)短信</code>
<code> </code>
<code> </code>
<code>class</code> <code>Messager(</code><code>object</code><code>):</code>
<code> </code>
<code> </code><code>def</code> <code>__sendMessage(</code><code>self</code><code>, phoneNumber, message):</code>
<code> </code><code>if</code> <code>not</code> <code>self</code><code>.execCmd(</code><code>'AT+CMGF=0'</code><code>).endswith(b</code><code>'\r\nOK\r\n'</code><code>): </code><code>#设置PDU格式</code>
<code> </code>
<code> </code><code>pdu_content </code><code>=</code> <code>self</code><code>.encodeMessage(phoneNumber, message)</code>
<code> </code><code>cmd </code><code>=</code> <code>'AT+CMGS=%d'</code> <code>%</code> <code>((</code><code>len</code><code>(pdu_content)</code><code>-</code><code>2</code><code>)</code><code>/</code><code>2</code><code>)</code>
<code> </code><code>if</code> <code>not</code> <code>self</code><code>.execCmd(cmd).endswith(b</code><code>'\r\n> '</code><code>): </code>
<code> </code><code># 十六进制的1A为结束符</code>
<code> </code><code>if</code> <code>not</code> <code>self</code><code>.execCmd(pdu_content </code><code>+</code> <code>'\x1A'</code><code>, end</code><code>=</code><code>'</code><code>').endswith(b'</code><code>\r\nOK\r\n'): </code>
<code> </code><code># 调用私有方法 __sendMessage</code>
<code> </code><code>if</code> <code>self</code><code>.__sendMessage(phoneNumber, message):</code>
<code> </code><code># 将中文信息编码为PDU格式(ucs2)</code>
<code> </code><code>def</code> <code>encodeMessage(</code><code>self</code><code>, phoneNumber, message):</code>
<code> </code><code>tpdu </code><code>=</code> <code>[]</code>
<code> </code><code>if</code> <code>phoneNumber </code><code>and</code> <code>message: </code>
<code> </code><code>tpdu.append(</code><code>'001100'</code><code>)</code>
<code> </code><code>formatAddress </code><code>=</code> <code>self</code><code>.encodePhoneNumber(phoneNumber)</code>
<code> </code><code>tpdu.append(formatAddress)</code>
<code> </code><code>tpdu.append(</code><code>'0008AA'</code><code>)</code>
<code> </code><code>tpdu.append(</code><code>'%02X'</code> <code>%</code> <code>(</code><code>len</code><code>(message)</code><code>*</code><code>2</code><code>))</code>
<code> </code><code>content </code><code>=</code> <code>'</code><code>'.join(['</code><code>%</code><code>02X</code><code>' % c for c in message.encode('</code><code>utf_16_be')])</code>
<code> </code><code>tpdu.append(content)</code>
<code> </code><code>print</code><code>(''.join(tpdu))</code>
<code> </code><code>return</code> <code>''.join(tpdu)</code>
<code> </code><code># 将手机号编码为pdu所需格式</code>
<code> </code><code>def</code> <code>encodePhoneNumber(</code><code>self</code><code>, phoneNumber):</code>
<code> </code><code>#号码为11位数字</code>
<code> </code><code>if</code> <code>not</code> <code>re.match(r</code><code>'\d{11}'</code><code>, phoneNumber):</code>
<code> </code><code>print</code><code>(</code><code>'Error phoneNumber: %s'</code> <code>%</code> <code>phoneNumber)</code>
<code> </code><code>addr </code><code>=</code> <code>'0D'</code> <code>#号码长度13</code>
<code> </code><code>addr </code><code>+</code><code>=</code> <code>'91'</code> <code>#Type-of-Address,目标地址格式(TON/NPI) </code>
<code> </code><code>#加86、F补成偶数个(14位),分7组翻转</code>
<code> </code><code>phoneNumber </code><code>=</code> <code>'86'</code> <code>+</code> <code>phoneNumber </code><code>+</code> <code>'F'</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>0</code><code>, </code><code>7</code><code>): </code>
<code> </code><code>addr </code><code>+</code><code>=</code> <code>phoneNumber[</code><code>2</code><code>*</code><code>i</code><code>+</code><code>1</code><code>] </code><code>+</code> <code>phoneNumber[</code><code>2</code><code>*</code><code>i]</code>
<code> </code><code>return</code> <code>addr</code>
<code> </code><code>messager </code><code>=</code> <code>Messager()</code>
<code> </code><code>messager.sendMessage(</code><code>'18688754379'</code><code>, </code><code>'你好'</code><code>)</code>
<code> </code><code>messager.sendMessage(</code><code>'18688754379'</code><code>, </code><code>'大家好'</code><code>)</code>
相关阅读:
<a href="http://down.51cto.com/data/2367032" target="_blank">附件:http://down.51cto.com/data/2367032</a>
本文转自walker snapshot博客51CTO博客,原文链接http://blog.51cto.com/walkerqt/1970472如需转载请自行联系原作者
RQSLT