Telitの最初のシンプルなファームウェアを作成します

画像

良い一日、親愛なるコミュニティ!



たまたま、私はかなり興味深いTelit GL865-DUALモデムのファームウェアを作成するタスクに直面しなければなりませんでした 。 そして、このトピックでは、少なくとも一般的には、そのためのファームウェアを開発するプロセスを説明したいと思います。



それでは、おそらく、Telitのファームウェアが「突き出る」場所の一般的な考えから始めましょう。 これは公式文書の図によって非常に明確に示されています



画像



このスキームから明らかなように、ファームウェアはデバイスで動作し、既製のインターフェースを介して通信しますが、かなりcr屈な状態です。 ところで、私はすぐに予約をしたいと思います-図に示されているメモリボリュームは非常に抽象的です。 たとえば、 Telit GL865-DUALでは、1メガバイトのRAMと2メガバイトのフラッシュメモリしか使用できません。



使用可能なインターフェースに関するいくつかの言葉。 9つありますが、ワーカーの数は、スクリプトが実行される鉄片に直接依存します。

MDM


インターフェイスが最も重要です。 ATコマンドの送受信、ネットワークからのデータの送受信などを行うことができます。 それを介して送信されるデータは、ATコマンドハンドラーを使用して処理されます。 MDMモジュールは実際のシリアルポートと対話しないため、ポートの設定は関係ありません。データは引き続きモジュールに到達します。



MDM2


これは、PythonとATコマンドハンドラーの間の2番目のインターフェイスです。 これにより、MDMインターフェイスがビジーのときにATコマンドへの応答を送受信できます。



SER


このインターフェイスにより、Pythonスクリプトはデータを読み取り、通常はモジュールにATコマンドを送信するために使用される物理シリアルポートASC0にデータを送信できます(たとえば、コンピューターから外部からモジュールと通信する場合)。 Pythonスクリプトの実行中、このシリアルポートは完全に自由に使用でき、ATコマンドハンドラーによって使用されません(つまり、この時点ではこのポートにコマンドを送信できません)。 Pythonスクリプトを使用して、このポートでフロー制御を制御することはできません。



SER2


このインターフェイスにより、Pythonスクリプトは、デバッグに一般的に使用される物理シリアルポートASC1に対してデータを読み書きできます。



GPIO


このインターフェイスにより、ATコマンドプロセッサをバイパスして入力/出力ポートを制御する(または単に足を蹴る)ことができます。



MOD


インターフェースは、ユーザー定義関数のセットです。



IIC


インターフェイスは、PythonコアのIICバスマスターの実装です。 これにより、Pythonは既存のGPIOピンに1つ以上のIICバスを作成できます。



SPI


このインターフェイスは、PythonコアのSPIマスターバスの実装です。 これにより、Pythonは既存のGPIOピンに1つ以上のSPIバスを作成できます。



GPS


このインターフェースは、PythonとGPSモジュールに統合されたコントローラーとの間の相互作用を提供します。 ATコマンドをバイパスして、彼と一緒に作業できます。



このインターフェースのセットにより、原則として、かなり容認できる速度で鉄を使った詐欺を実行できます。 しかし、落とし穴がないわけではありません。 Pythonを移植するとき、なんらかの理由でTelitの人々は、次のような単純なデータ型の言語サポートを削除しました。





そのため、残念ながら、鉄片に対していくつかの複雑な計算を実行する方法はありません。 悲しいことに十分です-最初の単純なファームウェアの作成とテストに直接行くときです。 デバイスはすでに動作準備が整っていると想定しています。 そうでない場合は、 ここここへようこそ。



デバイスとの通信を確保するために、私は個人的にRSTermターミナルを使用してます。 便利で持ち運びが簡単で、無料のようです。



それでは、ファームウェア自体の作成を始めましょう。 「Hello world」というテキストを含むSMSを携帯電話に送信することほど馬鹿げたことはありませんでした。



スクリプトの最初に、必要なインターフェイスを接続します

import MOD import MDM
      
      







さらに、物事の論理に従って、モジュールがネットワークに登録されているかどうかを確認する必要があります。 これを行うために、ATコマンドAT + CREGを送信する単純な関数をスケッチしましたか? 結果を処理します。

 def checkNetwork(): MOD.sleep(20) REC_TIME = 200 for _ in range(10): MDM.send("AT+CREG?\r",0) res = MDM.receive(REC_TIME) if (res.find('0,1')!=-1): return 1 else: MOD.sleep(50) return 0
      
      







はい、ほとんど忘れていました。 TelitのPythonはboolのような型を認識しないため、0と1で作業する必要があります。



もちろん、SMSの送信に役立つ機能が必要です。 私はそのようなものを得た。

 def sendSMS( number, smstext, csca): if number=="" or smstext=="" or csca == "" : return 0 MDM.send('AT+CSCA='+csca+'\r',2) MDM.receive(20) MDM.send('AT+CMGF=1\r',2) MDM.receive(20) a = MDM.send('AT+CMGS="' + number + '"\r', 2) res = MDM.receive(10) a = MDM.send(smstext, 2) a = MDM.sendbyte(0x1A, 2) a='' while a=='': a = MDM.receive(20) return ( a.find('OK')!=-1 )
      
      





そのパラメーターは、それぞれ次のとおりです。

  1. 電話番号
  2. メッセージ本文
  3. オペレーターメッセージセンター番号。




さて、今はこれをすべてロジックでラップし、少なくとも単純なデバッグを提供するだけです。 はい、デバイスのシリアルポートである2番目のポートをデバッグに使用できますが、私にとってはあまりにもシックだったので、便宜上、最初のシリアルポートへのprintコマンドの出力を再定義しました。

 import SER2 SER.set_speed('115200','8N1') class SerWriter: def __init__(self): SER.set_speed('115200','8N1') def write(self,s): SER.send(s+'\r') sys.stdout = sys.stderr = SerWriter()
      
      







さて、ソースコード全体

 import MOD import MDM import SER SER.set_speed('115200','8N1') class SerWriter: def __init__(self): SER.set_speed('115200','8N1') def write(self,s): SER.send(s+'\r') sys.stdout = sys.stderr = SerWriter() def checkNetwork(): MOD.sleep(20) REC_TIME = 200 for _ in range(10): MDM.send("AT+CREG?\r",0) res = MDM.receive(REC_TIME) if (res.find('0,1')!=-1): return 1 else: MOD.sleep(50) return 0 def sendSMS( number, smstext, csca): if number=="" or smstext=="" or csca == "" : return 0 MDM.send('AT+CSCA='+csca+'\r',2) MDM.receive(20) MDM.send('AT+CMGF=1\r',2) MDM.receive(20) a = MDM.send('AT+CMGS="' + number + '"\r', 2) res = MDM.receive(10) a = MDM.send(smstext, 2) a = MDM.sendbyte(0x1A, 2) a='' while a=='': a = MDM.receive(20) return ( a.find('OK')!=-1 ) print "Start" while not checkNetwork(): print "No network" MOD.sleep(10) print "I find network" myNumber = "+7960*******" myText = "Hello world" smsGate = "+79037011111" print "Try to send SMS" if sendSMS(myNumber,myText,smsGate): print "SMS sended" else: print "SMS not sended"
      
      







このスクリプトをhello.pyとして保存しました



RSTermを開き、 Telit Pythonメニューを選択し、選択したファイルをPCからモジュールにアップロードボタンを使用してファイルをアップロードし、 AT#ESCRIPT =“ hello.py”ボタンを使用してアクティブにし、 AT#EXECSCRボタンで開始するだけです。



この資料が少なくとも誰かに役立つことを願っています。 ご清聴ありがとうございました。



All Articles