1
TrueSTUDIO 用 F4D_Mail_BP359x の説明 V001 2014/09/16
CPU 基板から Mail 送信を行う STM32F4 Discovery 用のプロジェクトサンプルです。RAM の使用量は 10Kbyte 未満です。
ROHM 社製 WIFi モジュール BP3591 を使用して、WiFi ブロードバンドルータに接続して Mail 送信を行います。 (BP3595, BP3599 でも動作します。)
nifty と yahoo のメールサーバで Mail 送信を確認してあります。
コミュニケーションモードで動作します。Mail 送信には socket 4 を使用しています。
WiFi 接続と Mail 送信のためのパラメータは #define で定義しています。プログラムに埋め込みになります。
試用版の開発ツール Atollic TrueSTUDIO for ARM Lite で作成したプロジェクトです。
2
目次
1. STM32F4 Discovery と WiFi モジュール BP359x との接続 ... 3
1.1. ROHM 株式会社製の WiFi モジュール BP359x と接続用基板 BP359D とのセットの場合 ... 3
1.2. 東亜無線株式会社製 TMD3591AD との接続 ... 4
2. CPU 基板から Mail 送信するための Network 構成... 5
3. プログラム実行時の動作と動作確認 ... 6 3.1. プログラム実行時の動作 ... 6 3.2. Mail 送信の様子 ... 6 3.3. DHCP について ... 7 3.4. smtp 認証について ... 7 3.5. Mail 送信方法 ... 7 3.6. WiFi 接続と Mail 送信のためのパラメータ設定 ... 8 1) WiFi ルータのパラメータ設定 (NetworkParam.h) ... 8
2) TCP/IP の Port 番号の設定 (NetworkParam.h) ... 8
3) TCP/IP のアドレスの設定 (NetworkParam.c) ... 9 4) Mail 送信パラメータ設定 (NetworkParam.h) ... 10 4. プロジェクトの構成 ... 12 4.1. 追加したソース・フォルダとファイル... 12 5. 主なモジュールの説明 ... 14 5.1. ソース・フォルダ src 内のファイル ... 14 5.2. HandleTIM.c ... 15 5.3. UserPrograms ... 16 6. Mail_BP359x のプログラムの構造 ... 18 6.1. 処理番号を使用したプログラムのフロー ... 18 6.2. 処理番号を使用したプログラムの形 ... 19 7. Network 処理モジュールの概要 ... 20 7.1.ソースフォルダ Network の下のファイル ... 20 7.2. フォルダ BP359x ... 21 9. Mail 送信プログラムのおおまかなフロー ... 27 9.1. 全体 ... 27 9.2. Network 処理 : TransactNetwork();... 27
9.3. Network Access : NetworkAccessBP359x(); ... 28
3 1. STM32F4 Discovery と WiFi モジュール BP359x との接続 WiFi モジュール BP359x をアクセスするために UART(非同期シリアル通信)を使用します。 1.1. ROHM 株式会社製の WiFi モジュール BP359x と接続用基板 BP359D とのセットの場合 表1.1. BP359D と STM32F4 Discovery との接続信号 CN1 番号 BP359D の信号名 CPU 信号名 CPU 機能名 コネクタピン番号 備考 1 GND --- --- --- 2 GPIO0 --- --- --- 3 GPIO1 --- --- --- 4 VCC --- --- +3.3V 5 VCC --- --- +3.3V 6 BOOT_SEL1 --- --- --- 10k の抵抗でプルアップ 7 BOOT_SEL0 --- --- --- 8 FLASH_SEL --- --- --- 9 GND --- --- --- CN2 番号 BP359D の信号名 CPU 信号名 CPU 機能名 コネクタピン番号 備考 1 GND --- --- --- 2 SDDATA1 --- --- --- 3 SDDATA0 --- --- --- 4 UART_RxD PD8 USART3_TX P1-40 5 UART_TxD PD9 USART3_RX P1-41 6 GPIO6 --- --- --- 7 PRST PD10 I/O P1-42 Network_Reset 8 GPIO2 --- --- --- Status_LED 9 GND --- --- --- BOOT_SEL_1 を抵抗 10k でプルアップするための接続は次のようにします。 BOOT_SEL_1 抵抗 10k VCC Status_LED の接続は次のようにします。 GPIO2 抵抗 3.3k GND
4 1.2. 東亜無線株式会社製 TMD3591AD との接続
表1.2. TMD3591AD と STM32F4 Discovery との接続信号
番号 TMD3591AD の信号名 CPU 信号名 CPU 機能名 コネクタピン番号 備考
1 VCC --- --- --- +3.3V 2 VCC --- --- --- +3.3V 3 PRST PD10 I/O P1-42 Network_Reset 4 GPIO0 --- --- --- 5 GPIO1 --- --- --- 6 GPIO2 --- --- --- Status_LED 7 GPIO6 --- --- --- 8 M_ANA --- --- --- 9 FLASH_SEL --- --- --- 10 BOOT_SEL_0 --- --- --- 11 UART_RXD PD8 USART3_TX P1-40 12 UART_TXD PD9 USART3_RX P1-41 13 SDATA1 --- --- --- 14 SDATA0 --- --- --- 15 GND --- --- --- 16 GND --- --- ---
5 2. CPU 基板から Mail 送信するための Network 構成
ルータと CPU 基板の接続は次のようになります。 ルータ WiFi モジュール BP3591 CPU 基板 UART Web
6 3. プログラム実行時の動作と動作確認
3.1. プログラム実行時の動作
1) プログラムを実行すると基板上の Status LED LD4(緑)が 1 秒点灯、2 秒消灯 で点滅します。
2) プログラムの動作が開始してから、BP3591 と WiFi ルータの接続が確立するのに、約 20 秒程度かかります。
BP3591 の GPIO2 に Status LED を接続している場合、接続確立中は1秒間隔で点滅します。接続が確立すると点灯した ままになります。 ただし、コンフィグレーションが行われなかった場合など、最初から点灯したままなので注意が必要です。 20 秒近く点滅した後、点灯したらルータとの接続が確立したと判断するとよいと思います。 3.2. Mail 送信の様子 基板上の User スイッチを一回押すと一回 Mail 送信を行います。通常、10 秒以内に送信処理が終了します。 回線の状態によっては、数分かかることもあります。 User スイッチは一回押したら、十秒以上待ってから次を押してください。続けざまに Mail 送信するのはよくありません。 なお、プログラムをデバッグするときやプログラム作成において スパムメールにならないように細心の注意を払うように してください。
User スイッチを押したとき、Mail 送信を開始して LD3(緑)が点灯します。Mail 送信が終了すると LD4(緑)は消灯します。
1) STM32F4 Discovery の User スイッチを何回か押して nifty の Mail ソフトで受信した様子を以下に示します。
a) 差出人は “I’m STM32F407VG.” です。
b) Mail の題名は “a Mail from STM32F4 No.x” です。 xの部分は User スイッチを押すごとに +1 されます。 c) Mail の本文は “a Test Mail from STM32F4 Discovery No.x” です。xの部分は上記と同様です。
7 3.3. DHCP について
本プロジェクトサンプルでは、動作開始時に DHCP 処理を使用してルータに IP アドレスを自動割り当てしてもらいます。
3.4. smtp 認証について
本プロジェクトサンプルでは EHLO コマンド(Extended Hello : smtp サービス拡張機能を使用開始する)を SMTP サーバに 送信して通信を開始し、smtp 認証を行った後、メール送信を行います。 smtp 認証には PLAIN を使用します。ユーザーIDとパスワードを BASE64 エンコードと呼ばれるコードに変換して、 SMTP サーバに送信して認証を行います。 セキュリティ的にはだいぶ弱いですが、簡単なものを採用しました。 3.5. Mail 送信方法 本プロジェクトサンプルの main.c の例のように main()関数の無限ループの中で //---// Network処理 //---TransactNetwork(&uint8_JobNum); が呼び出されている場合、他のモジュールから以下のような操作をすることにより、Mail 送信を行うことができます。 a) Mail 題名をセットする。 以下の Buffer GLB_uint8_MailSubject に題名をセットします。 uint8_t GLB_uint8_MailSubject[defSizeMailSubject]; // Mail題名
b) Mail本文をセットする。
以下の Buffer GLB_uint8_MailBody に本文をセットします。
uint8_t GLB_uint8_MailBody[defSizeMailBody + defSizeMailDate]; // Mail本文
c) Mail 送信フラグを ON にする。
以下のフラグ GLB_int16_vSendMailNetwork を 1 にすると Mail 送信を行います。
// Mail送信要求フラグ : 1 = Mail送信開始 : Mail送信正常終了時 0 になる。Error終了の場合 -1 になる。
8 3.6. WiFi 接続と Mail 送信のためのパラメータ設定 本プロジェクトサンプルでは WiFi 接続パラメータと DDNS パラメータは #define で定義しています。 したがって、プログラムに埋め込みになります。 使用環境に応じて、設定部分を変更する必要があります。 1) WiFi ルータのパラメータ設定 (NetworkParam.h) NetworkParam.h内の下記の部分を使用するWiFiルータに合わせて書き換えてください。 項目は上から、SSID, SecurityKey, PinCode の3項目です。
//---// WiFiルータの設定
//---// 実際の環境に合わせて書き換えてください。
//---#define defSSID "URoadWPS-35F14B"
#define defSecurityKEY "01234567"
#define defPinCode "76543210"
2) TCP/IP の Port 番号の設定 (NetworkParam.h)
本プロジェクトサンプルでは defTCP_ServerPort と defPortQueryIP を使用しています。。 //---//Port番号 //---// 実際の環境に合わせて書き換えてください。
//---#define defTCP_ServerPort 10000 // TCP Server Port. : Port Number
#define defHTTP_ServerPort 10001 // HTTP server port. : Port Number
#define defPortQueryIP 10002 // DDNS WAN側IP Address更新処理 ポート番号
#define defPortMail 10003 // Mail送信 ポート番号
//---9 3) TCP/IP のアドレスの設定 (NetworkParam.c)
ConfigBP359x.h において、以下に示す#define defDHCP を定義している場合は DHCP が有効になり、ルータが IP アドレスを割り当ててくれます。 //---// DHCPを有効にする場合は定義する。 //---// ルータに固定のIP Addressを設定して使用する場合はコメントアウトする。 //---#define defDHCP 上記の定義をしないで DHCP を無効にして自分でルータに IP アドレスを設定する場合は、 NetworkParam.c 内の下記の部分の TCP/IP にアクセスするためのアドレスを設定したアドレスに変更してください。 上から、IP アドレス、 Mask アドレス、 Gateway アドレス です。
//---// IP Addressの設定
//---// 実際の環境に合わせて書き換えてください。
//---uint8_t GLB_uchrIP[4] = {192, 168, 100, 109}; // Source IP Address
uint8_t GLB_uchrMaskIP[4] = {0xFF, 0xFF, 0xFF, 0x00}; // IP Address Mask
uint8_t GLB_uchrGatewayIP[4] = {192, 168, 100, 254}; // Gateway IP Address
//---10 4) Mail 送信パラメータ設定 (NetworkParam.h)
Mail 送信するためのパラメータを設定します。
下記のそれぞれのパラメータは実際に登録した内容に合わせて書き換えてください。
1) Mail Server の URL は契約しているプロバイダの URL に変更してください。
例えば nifty の場合は、smtp.nifty.com に、YAHOO の場合は smtp.mail.yahoo.co.jp になります。
2) Mail 宛先の URL は送信したい URL に変更してください。 例 : [email protected] [email protected] 3) 差出人の URL は契約している自分のメールアドレスです。 4) UserID と Pasword は契約しているメールのものです。 5) 差出人名はメールに表示されます。 //---// Mail送信パラメータ //---// 実際の環境に合わせて書き換えてください。 -- //---// Mail Server Port
//---// 使用しているメールサーバーに合わせて25または587を指定してください。 //---// smtp認証を行うようになってから 587 を使用するようです。 //---//#define defPortSendMail 25 //---#define defPortSendMail 587 //---// Mail Server URL
//---// 例 : 以下のようなメールサーバがあります。
// smtp.nifty.com : niftyのMailサーバ
// smtp.mail.yahoo.co.jp : YAHOOのMailサーバ
//---#define defMailServerURL "smtp.nifty.com"
//#define defMailServerURL "smtp.mail.yahoo.co.jp"
//---11 //---// 差出人のURL //---// 自分が契約しているメールアドレスを指定してください。 //---// 例 : // [email protected] // nifty // [email protected] // YAHOO
//---#define defMailSenderURL "[email protected]"
//#define defMailSenderURL "[email protected]"
//---// 契約しているUaerIDとPaswordを指定してください。 //---// UserID : 自分のメールアドレスの@の前の部分です。 //---// 例 : // [email protected] // nifty // [email protected] // YAHOO
//---#define defMailUserID "UserID"
//---// Password
//---#define defMailPassword "Password"
//---// 差出人名
#define defMailSenderName "I'm STM32L152RB."
// Mail題名
#define defMailSubject "a Mail from STM32L"
//---// Mail宛先のURL //---// 試験の時は他人に迷惑が掛からないように自分宛に送信してください。
//---#define defMailAddressURL "[email protected]"
//---12 4. プロジェクトの構成 TrueSTUDIO で作成したプロジェクト F4D_Mail_BP359x を開いた状態を以下に示します。 左側のプロジェクト・エクスプローラーの F4D_Mail_BP359x を展開した状態です。 4.1. 追加したソース・フォルダとファイル 追加したソース・フォルダとファイルについて簡単に説明します。 1) CommonModules (ソース・フォルダ) 共通に使用するモジュールを記述してあります。 時間待ち、文字列操作 などの処理を記述しています。 2) Handles(ソース・フォルダ) Peripheral の設定などを行っています。 a) HandleGPIO.h HandleGPIO.c (ファイル) GPIO 入出力の初期設定を記述しています。 b) HandleTIM.h HandleTIM.c (ファイル) タイマ割り込みを使用するために、タイマの初期設定を記述しています。 1mSec ごとにタイマ割り込みが発生するように設定しています。 c) HandleUART.h HandleUART.c (ファイル) UART の初期化処理を記述しています。
13 3) Network(ソース・フォルダ) Mail 送信の処理を記述しています。 a) NetParam.h NetParam.c (ファイル) WiFi ルータに接続するためのパラメータを設定します。 b) NetUtilities.h NetUtilities.c (ファイル) 文字列の IP アドレスを 32bit のデータに変換する処理や、32bit データを文字列の IP アドレスに変換するなど、 Network 処理に使用する共通処理を記述しています。 c) Network.h Network.c (ファイル) Network 通信処理の一番上位のモジュールです。 BP3591 のコンフィグレーション を行った後、Network 通信処理をループします。 User スイッチが押されたときにMail送信を行います。 4) BP359x : フォルダ Network の下にフォルダ BP359x があります。 a) AccessBP359x.h AccessBP359x.c(ファイル) 受信データからフレームデータを取り出し、種類により処理します。 Mail 送信の処理を行います。 b) Communicate_BP359x.h Communicate_BP359x.c(ファイル) UART により BP3591 と送受信する処理を行います。USART3 を使用します。 c) ConfigBP359x.h ConfigBP359x.c(ファイル) BP3591 をコンフィグレーションします。 d) HandleBP359x.h HandleBP359x.c(ファイル) BP3591 のコミュニケーションモードを使用するための WID の書き込み、読み込みを行います。 e) SendMail_BP359x.h SendMail_BP359x.c(ファイル) Mail 送信を行います。 5) UserPrograms (ソース・フォルダ) LED のための処理を記述しています。 a) UserPrograms.h UserPrograms.c (ファイル)
Status LED : LD4(緑) に使用している GPIO の初期設定と点滅処理を記述しています。 LD6(青)に使用している GPIO の初期設定を記述しています。
14 5. 主なモジュールの説明 5.1. ソース・フォルダ src 内のファイル ソース・フォルダ src 内のファイルでプログラムを追加した主なファイルについて簡単に説明します。 1) main.c a) main 関数 プログラムはここから開始します。主に初期化処理関数を呼び出しています。 int main(void) b) 使用する周辺クロックの初期化 void RCC_Configuration(void); c) GPIO の初期化 void Init_GPIOs(void); d) システムクロック SYSCLK の設定 内部クロック HIS を使用して、システムクロック SYSCLK を 32MHz に設定します。 //---// HSIを選択して、PLL ClockをSystem Clockとして使用する。 : SYSCLK = 32MHz
//---void SetHSICLK(//---void);
e) Mail 送信試験
User スイッチが押されるごとに、Mail 送信を一回行います。Mail 送信が終了するまで、次の User スイッチ入力を 受け付けません。 //---// Mail送信試験 //---int16_t Test_SendMail(void); 2) stm32f4xx_it.h stm32f4xx_it.c この File に割り込み処理を記述します。
15 5.2. HandleTIM.c 1) TIM13 と TIM14 の初期化 タイマ割り込みのために TIM13 と TIM14 を初期化してインターバルをセットします。 1mSec ごとに割り込みがかかるように設定しています。 以下の関数の引数に TIM13 または TIM14 用のパラメータを指定してタイマを初期化します。 //---// TIMxx初期化 //---//引数 :
// TIM_TypeDef *TIMxx : TIM選択
// uint32_t RCC_APB1Periph_TIMxx : specifies the APB1 peripheral to gates its clock. // uint16_t uint16_TIMxx_CCR1 : TiMxx CH1のインターバル
//---void InitializeTIMxx(TIM_TypeDef *TIMxx, uint32_t RCC_APB1Periph_TIMxx, uint16_t uint16_TIM);
2) タイマ割り込み許可 以下の関数の引数に希望する TIMxx 用のパラメータを指定して割り込みを許可します。 //---// TIMxx割り込み許可 //---//引数 :
// uint32_t RCC_APB1Periph_TIMxx : specifies the APB1 peripheral to gates its clock. // uint8_t TIMxx_IRQn : STM32 specific Interrupt Numbers
16 5.3. UserPrograms
UserPrograms.h には LED に使用する GPIO に対する定義を記述してあります。
以下に、UaerPrograms.c に記述している関数の説明を記します。 1) LED に使用する GPIO の初期化(共通処理) GPIO番号とピン番号を指定して I/Oを初期化します。 //---// LEDポート初期化 //---//引数 :
// GPIO_TypeDef *GPIOx : GPIOポート指定 // uint16_t GPIO_Pin_x : GPIOピン指定
//---void InitializePortLED(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin_x);
2) LED の点滅処理(共通処理) GPIO番号とピン番号などを指定して 希望のLEDの点滅処理を行います。 //---// LED点滅 : 点灯/消灯 切り替え //---// 点灯/消灯 を切り替えると同時に 点灯時間/消灯時間 をセットする。 //---//引数 :
// GPIO_TypeDef *GPIOx : GPIOポート指定 // uint16_t GPIO_Pin_x : GPIOピン指定 // int16_t *pint16_OnOff : ON/OFF状態
// 0 : OFF // 1 : ON // uint16_t *puint16_Timer : 点灯時間/消灯時間をセットする変数のポインタ // uint16_t uint16_TimeON : 点灯時間 // uint16_t uint16_TimeOFF : 消灯時間
//---void BlinkLED(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin_x,
int16_t *pint16_OnOff, uint16_t *puint16_Timer, uint16_t uint16_TimeON, uint16_t uint16_TimeOFF);
17 3) LED に使用する I/O の初期化 a) Status LED : LD4(緑)初期化 //---// Status LEDポート初期化 : LD4(緑) //---void InitializePortStatusLED(//---void); b) LD3(橙)初期化 //---// LD3(橙) ポート初期化 //---void InitializePortLD3(//---void); c) LD3(青)初期化 //---// LD5(赤) ポート初期化 //---void InitializePortLD5(//---void); d) LD6(青)初期化 //---// LD6(青) ポート初期化 //---void InitializePortLD6(//---void); 4) LED の点滅 a) StatusLED : LD4(緑)点滅 //---// Status LED点滅 : LD4(緑) : 点灯/消灯 切り替え //---// TIMx割り込み内でGLB_uint16_BlinkTimerStatusLEDをデクリメントする。 // GLB_uint16_BlinkTimerStatusLEDが0になった時、呼び出される。 //---// 点灯/消灯 を切り替えると同時に 点灯時間/消灯時間 をセットする。 //---//引数 : // uint16_t uint16_TimeON : 点灯時間 // uint16_t uint16_TimeOFF : 消灯時間
18 6. Mail_BP359x のプログラムの構造 Mail_BP359x のプログラムは処理番号を使用して、順次処理を行う構造をとっています。 6.1. 処理番号を使用したプログラムのフロー 処理番号を使用したプログラムの概念的なフローを以下に示します。 この例ではモジュールが 処理番号0、 処理番号1、 処理番号2 の3個の処理で構成されています。 処理番号0 -> 処理番号1 -> 処理番号2 -> 処理番号0 -> ...と処理番号0 ~ 処理番号2を繰り返します。 また、戻り値は処理中は -1、 最後の処理番号の処理で正常終了時 0、エラーが発生した場合 NG : 1 以上の値を 返します。 YES 開始 処理番号による分岐 処理番号0の処理 処理番号1の処理 処理番号2の処理 処理終了? NO 処理番号 +1 終了 YES 処理終了? NO 処理番号 +1 YES 処理終了? NO 処理番号 = 0 戻り値 = -1 戻り値 = -1 戻り値 = 0
19 6.2. 処理番号を使用したプログラムの形 例えば、処理番号 : uint8_t uint8_JobNum を用いて次のように処理します。 この例では、通信の処理において 受信待ちをしてデータを受信したらデータの処理をして応答のための送信処理を 行っています。送信処理が終了したら受信待ちに戻ります。 //戻り値 : // -1 : 処理中 // 0 : OK 終了 // 1 以上 : NG 終了 int16_t 送受信処理() { switch(uint8_JobNum){ case 0: int16_Return = 受信処理(); if(int16_Return == -1){ break; //処理中 } if(int16_Return > 0){ int16_Return = 1; //NG 終了 break; } 受信データによる処理と送信データ作成(); uint8_JobNum++; //次の処理番号 int16_Return = -1; //処理中 break; case 1: int16_Return = 送信処理(); if(int16_Return == -1){ break; //処理中 } uint8_JobNum = 0; //処理番号を 0 に戻す int16_Return = 0; //OK 終了 break; } return(int16_Return); } 上記の 受信処理(); と 送信処理(); の内部も同じ構造で記述されています。戻り値が -1 の時は処理中で同じ処理番号 の部分をループして、処理が OK 終了だった場合、処理番号を進めて、次の処理を行います。
20 7. Network 処理モジュールの概要 Network 処理のためのモジュールについて概要を説明します。 BP359x は BP3591、 BP3595、 BP3599 を表しています。 プロジェクトのソースフォルダ Network のしたに、上位モジュールを記述したファイルと BP359x をアクセスするための モジュールが記述されたソースファイル群が格納されているフォルダ BP359x があります。 7.1.ソースフォルダ Network の下のファイル 1) Network Network 処理の最上位のモジュールです。 Network の初期化を行った後、Network 通信処理をループします。 a) TransactNetwork //---// Network処理 //---// BP359xの初期化を行った後、Network通信処理をLoopする。 //---//引数 : // uint8_t *puint8_JobNum : 処理番号のポインタ
//---int16_t TransactNetwork(uint8_t *pint8_JobNum);
2) NetParam
a) SetNetworkParameter
Network 接続のためのパラメータ、WiFi の SSID, SecurityKEY や IP アドレス のパラメータなどを 設定します。 //---// Networkパラメータ設定 //---//戻り値: // 0 : OK // 1以上 : NG //---int16_t SetNetworkParameter(void); 3) NetUtilities Network 処理のための共通モジュールを記述してあります。
21 7.2. フォルダ BP359x 1) AccessBP359x a) NetworkAccessBP359x BP359x にアクセスして Network 通信を行います。 //---// Network通信処理 //---//引数 : // uint8_t *puint8_JobNum : 処理番号
// struct sNetworkData *pstructNetworkData : 受信したNetworkデータを格納する構造体のポインタ //戻り値:
// -1 : 処理中
// 0 : OK終了
22 2) Communicate_BP359x BP359x との通信処理を行います。 a) UART_SendBP359x BP359x にデータを送信します。 //---// BP359x UART送信 //---//引数 : // uint8_t *puint8_JobNum : 処理番号のポインタ // uint16_t uint16_Length : 送信データ数 // uint8_t *puint8_Data : 送信データのポインタ //戻り値 : // -1 : 処理中 // 0 : OK終了
//---int16_t UART_SendBP359x(uint8_t *puint8_JobNum, u//---int16_t uint16_Length, uint8_t *puint8_Data);
b) UART_ReceiveBP359x BP3591 からデータを受信します。 //---// BP359x UART受信 //---//引数 : // uint8_t *puint8_JobNum : 処理番号のポインタ
// struct sRxData *psutructRxData : 受信データの情報を格納する構造体のポインタ //戻り値 :
// -1 : 処理中
// 0 : OK終了
// 1以上 : NG
23 c) CommunicateReceiveBP359x BP359x からの受信データからフレームデータを取り出し、種類に見合ったデータを取得します。 //---// 受信 BP359x : 受信したデータの種類を識別して種類に見合ったデータを取得する。 //---//引数 : // uint8_t *puint8_JobNum : 処理番号
// struct sNetworkData *pstructNetworkData : 受信したNetworkデータを格納する構造体のポインタ //戻り値:
// -1 : 処理中
// 0 : OK終了
//---int16_t CommunicateReceiveBP359x(uint8_t *puint8_JobNum, struct sNetworkData *pstructNetworkData);
d) GetReceiveDataAndSetFlag_BP359x フレームデータから種類に見合ったデータを取得します。 //---// Data取得とflagセット : 受信データの種類(WID/DATA)によりフラグをセットして種類に見合ったデータを取得する。 //---//引数 :
// struct sNetworkData *pstructNetworkData : 受信したNetworkデータを格納する構造体のポインタ //戻り値:
// 0 : OK
// 1 : NG and Continue
// 2 : NG and End
24 e) ConnectClientTCP TCP/IP において Client 接続を行います。 //---// TCP Client接続 //---//引数 : // uint8_t *puint8_JobNum : 処理番号のポインタ
// struct sSocket *pstructSocket : パケットの内容をセットする構造体のポインタ
// struct sNetworkExpect *pstructNetworkExpect : 取得するデータを指定する構造体のポインタ //戻り値 :
// -1 : 処理中
// 0 : OK終了
// 1以上 : NG終了
//---int16_t ConnectClientTCP(uint8_t *puint8_JobNum, struct sSocket *pstructSocket,
struct sNetworkExpect *pstructNetworkExpect);
f) SendReceiveClientTCP Client 接続した相手と送受信を行います。 //---// TCP Client送受信 //---//引数 : // uint8_t *puint8_JobNum : 処理番号のポインタ
// struct sSocket *pstructSocket : パケットの内容をセットする構造体のポインタ
// struct sNetworkExpect *pstructNetworkExpect : 取得するデータの指定および受信データの情報を 格納する構造体のポインタ
//---// 受信データ情報はAccessBP359x.c内のモジュール、NetworkAccessBP359xの中で // struct sNetworkExpect *pstructNetworkExpectにセットされる。
//---//戻り値 : // -1 : 処理中 // 0 : OK終了 // 1以上 : NG終了
//---int16_t SendReceiveClientTCP(uint8_t *puint8_JobNum, struct sSocket *pstructSocket,
25 3) ConfigBP359x a) InitializeBP359x BP3591 との通信に使用する UART を初期化し、BP3591 をコンフィグレーションします。 //---// WiFi BP359x初期化 //---//引数 : // uint8_t *puint8_JobNum : 処理番号のポインタ
// struct sNetworkData *pstructNetworkData : 受信したNetworkデータを格納する構造体のポインタ // struct sNetworkExpect *pstructNetworkExpect : 取得するデータを指定する構造体のポインタ //戻り値:
// -1 : 処理中
// 0 : OK
// 1 : NG
//---int16_t InitializeBP359x(uint8_t *puint8_JobNum, struct sNetworkData *pstructNetworkData);
b) EnterCommunicationMode BP3591 をコミュニケーションモードにします。 //---// コミュニケーションモードに移行 //---//引数 : // uint8_t *puint8_JobNum : 処理番号のポインタ //戻り値: // -1 : 処理中 // 0 : OK // 1 : Timeout
26 c) ConfigurationBP539x
BP359x をコンフィグレーションします。
//---// コンフィグレーションBP359x : 接続するWiFiのSSIDやBP359xのIP Address, Port番号などを設定する。 //---//引数 :
// uint8_t *puint8_JobNum : 処理番号のポインタ
// struct sNetworkExpect *pstructNetworkExpect : 取得するデータの指定および情報が格納されている 構造体のポインタ //戻り値 : // -1 : 処理中 // 0 : OK // 1 : NG(初期化失敗)
//---int16_t ConfigurationBP359x(uint8_t *puint8_JobNum, struct sNetworkExpect *pstructNetworkExpect);
4) HandleBP359x BP359x のコンフィグレーションモードにおいて WID 書き込み、読み込みを行います。 WID 処理をするためのモジュールを全て記述してあります。 この WID 処理のプログラムは結構めんどうくさいので、ライブラリの感覚で使用していただくのがよいと思います。 5) SendMail_BP359x Mail 送信処理を行います。 Mail 送信フラグが ON になると Mail 送信を一回行います。
27 9. Mail 送信プログラムのおおまかなフロー 9.1. 全体 main モジュール main();の処理です。 9.2. Network 処理 : TransactNetwork(); Network 処理の最上位の処理です。 開始 CPU 基板初期化 User スイッチが押されたとき、 Mail のデータを作成して、 Mail 送信フラグを ON にする。 Test_SendMail(); Network 処理 TransactNetwork() (内部で Mail 送信処理); 開始 BP359x 初期化
28 9.3. Network Access : NetworkAccessBP359x();
Network にアクセスする最上位の処理です。 BP3591 からデータを受信して、データが Mail 送信用のデータの場合、Mail 送信モジュールに渡します。 「Mail 送信処理」 は自分のデータであるかを判断して、自分のデータであれば処理を行います。 開始 Network Access パラメータ初期設定 BP3591 受信処理 GetReceiveDataBP359x(); SendMail_BP359x(); Mail 送信処理
29 10. Mail 送信処理モジュールの説明 フォルダ Network\BP359x 内の SendMail_BP359x.c にモジュールがあります。 Mail 送信フラグをチェックしてフラグが ON なら Mail 送信を一回行います。 1) Mail 送信モジュール Mail 送信モジュールのプロトタイプを以下に示します。 //---// Send Mail to Mail server : Mail送信
//---//引数 :
// uint8_t *puint8_JobNum : 処理番号のポインタ
// uint8_t uint8_Socket : Mail送信に使用するSocket番号
// struct sNetworkExpect *pstructNetworkExpect : 取得するデータを指定および受信データ情報を格納する 構造体のポインタ
//---// 受信データ情報はAccessBP359x.c内のモジュール、NetworkAccessBP359xの中で // struct sNetworkExpect *pstructNetworkExpectにセットされる。
//---//戻り値 : // -1 : 処理中 // 0 : OK終了 // 1 : 動作Error
//---int16_t SendMailNetwork(uint8_t *puint8_JobNum, uint8_t uint8_Socket,
struct sNetworkExpect *pstructNetworkExpect);
2) Mail 送信方法
a) Mail 題名をセットする。
以下の Buffer GLB_uint8_MailSubject に題名をセットします。 uint8_t GLB_uint8_MailSubject[defSizeMailSubject]; // Mail題名
b) Mail本文をセットする。
以下の Buffer GLB_uint8_MailBody に本文をセットします。
uint8_t GLB_uint8_MailBody[defSizeMailBody + defSizeMailDate]; // Mail本文
c) Mail 送信フラグを ON にする。
以下のフラグ GLB_int16_vSendMailNetwork を 1 にすると Mail 送信を行います。
// Mail送信要求フラグ : 1 = Mail送信開始 : Mail送信正常終了時 0 になる。Error終了の場合 -1 になる。
30 3) Mail 送信処理のフロー Mail 送信処理のフローを以下に示します。 YES NO YES NO 開始 Mail サーバの IP アドレス取得 接続確認 GetIPfromURL(); Mail 送信フラグ ON? ClientTCP セマフォ OFF? TCP Client 接続 処理番号0 処理番号1 処理番号2 処理番号3 処理番号4 処理番号5 処理番号7 処理番号6 処理番号13 処理番号9 処理番号10 SetWID_SOC_CONNECT(); 処理番号11 処理番号8 処理番号12 ConnectClientTCP(); EHLO コマンドをセット EHLO コマンド : 通信開始を通知と応答確認 smtp 認証データセット MAIL + FROM : 発信元を通知と応答確認 RCPT + TO : 宛先 URL データセット Mail ヘッダ + 本文 + <CR><LF>送信と応答確認 DATA コマンド : 送信開始を通知と応答確認 Mail ヘッダ + 本文 + <CR><LF>をセット QUIT コマンド : 通信終了を通知と応答確認 RCPT + TO : 宛先 URL を通知と応答確認 DATA コマンド : 送信開始データセット QUIT コマンドをセット TCP Client ソケット Close 終了 smtp 認証データ送信と応答確認 MAIL + FROM データセット 処理番号14 ソケットステータスの確認 処理番号15
31 改訂履歴