天天看點

Python 調用 GSM A6

【環境準備】

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) &lt; </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&gt; '</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&gt; '</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