主题中讨论的其他器件:CC3100
工具/软件:Code Composer Studio
我必须使用以下代码
1.确定 有助于通过 SMTP 建立连接的代码。
修改代码以根据外部模拟输入触发电子邮件应用程序。
因此、请帮助我找出这两个问题的答案。
/*
* main.c -发送电子邮件的示例应用程序
*
*
*
/*
*应用程序名称-电子邮件
*应用概述-此示例应用演示了 CC3100的工作原理
*可用于通过 SMTP 发送电子邮件。 应用程序
*将 CC3100配置为与 SMTP 服务器连接并发送
*发送电子邮件到它。 SMTP 服务器将其转发给收件人
*电子邮件服务器和收件人从接收电子邮件
*他使用 IMAP/POP3和/或其他专有技术的电子邮件服务器
*协议。
*应用程序详细信息- processors.wiki.ti.com/.../CC31xx_Email_Demo_Application
* doc\examples\email.pdf
*
#include "email.h"
#include "config.h"
#include "sl_common.h"
#define application_version "1.2.0"
#define SL_STOP_TIMEOUT 0xFF
/*
*全局变量--启动
*
_u32 g_Status = 0;
/*
*全局变量--结束
*
/*
*静态函数定义--启动
*
static _i32 enetconnectionWithAP();
static _i32 disconnectFromAP();
static _i32 configureSimpleLinkToDefaultState();
static _i32初始化 AppVariables();
静态空显示横幅();
static _i32 setEmail();
static _i32 SendEmail();
/*
*静态函数定义--结束
*
/*
*异步事件处理程序--启动
*
/*!
此函数用于处理 WLAN 事件
\param[in] pWlanEvent 是传递给处理程序的事件
\无返回
注意
警告
*
void SimpleLinkWlanEventHandler (slWlanEvent_t * pWlanEvent)
{
if (pWlanEvent ==空)
{
CLI_Write ("[WLAN 事件] NULL 指针错误\n\r");
返回;
}
switch (pWlanEvent->Event)
{
案例 SL_WLAN_CONNECT_EVENT:
{
SET_STATUS_BIT (G_Status、STATUS_BIT_CONNECTION);
/*
*将显示有关已连接 AP (如名称、MAC 等)的信息
*在'slWlanConnect人 Response_t'-应用程序中可用
如果需要、*可以使用它
*
* slWlanConnectResponse_t * pEventData =空;
* pEventData =&pWlanEvent->EventData.STAandP2PModeWlanConnected;
*
*
}
中断;
案例 SL_WLAN_DISCONNING_EVENT:
{
slWlan.当 值= NULL 时、ConnectResponse_t* pEventData =空;
CLR_STATUS_BIT (G_Status、STATUS_BIT_CONNECTION);
CLR_STATUS_BIT (G_Status、STATUS_BIT_IP_ACQUIRED);
pEventData =&pWlanEvent->EventData.STAandP2PModeDisconnected;
/*如果用户已启动'Disconnect'请求、'READON_CODE'为 SL_USER_Initiated_DISCONNECT */
if (sl_WLAN_DISCONNING_USER_Initiated_DISCONNECT = pEventData->Reason_code)
{
cli_Write (" Device disconnected from the AP on applicy's requests \n"r);
}
其他
{
CLI_Write ("设备因错误而从 AP 断开连接!!! \n\n");
}
}
中断;
默认值:
{
cli_Write ("[WLAN event] unexpected event \n\r");
}
中断;
}
}
/*!
\brief 此函数处理通过 DHCP 获取 IP 地址的事件
指示
\param[in] pNetAppEvent 是传递给处理程序的事件
\无返回
注意
警告
*
void SimpleLinkNetAppEventHandler (slNetAppEvent_t * pNetAppEvent)
{
if (pNetAppEvent ==空)
{
CLI_Write ("[NetApp 事件] NULL 指针错误\n");
返回;
}
switch (pNetAppEvent->Event)
{
案例 SL_NetApp_IPV4_IPACQUIRED_EVENT:
{
SET_STATUS_BIT (G_Status、STATUS_BIT_IP_ACQUIRED);
/*
*有关已连接 AP 的 IP、网关、DNS 等的信息
*将在'SlIpV4AcquiredASYNC_t'-应用程序中提供
如果需要、*可以使用它
*
* SlIpV4AcquiredASYNC_t * pEventData =空;
* pEventData =&pNetAppEvent->EventData.ipAcquiredV4;
* = pEventData->gateway;
*
*
}
中断;
默认值:
{
cli_Write ("[NetApp 事件]意外事件\n");
}
中断;
}
}
/*!
此函数用于处理 HTTP 服务器事件的回调
\param[in] pHttpEvent -包含相关事件信息
\param[in] pHttpResponse -应该由用户用填充
相关回复信息
\无返回
注意
警告
*
void SimpleLinkHttpServerCallback (slHttpServerEvent_t *pHttpEvent、
SlHttpServerResponse_t *pHttpResponse)
{
/*
*此应用程序不能与 HTTP 服务器配合使用-因此、请执行以下操作
*此处未处理/预期事件
*
cli_Write ("[HTTP EVENT]意外事件\n");
}
/*!
\brief 此函数处理一般错误事件指示
\param[in] pDevEvent 是传递给处理程序的事件
\无返回
*
void SimpleLinkGeneralEventHandler (slDeviceEvent_t * pDevEvent)
{
/*
*大多数一般错误并非致命错误都将被处理
*适当地由应用程序执行
*
cli_Write ("[一般事件]\n");
}
/*!
\brief 此函数处理套接字事件指示
\param[in] pSock 是传递给处理程序的事件
\无返回
*
void SimpleLinkSockEventHandler (SlSockEvent_t *插槽)
{
if (pSock ==空)
{
cli_Write ("[sock event] NULL 指针错误\n\r\n);
返回;
}
switch( pSock->Event )
{
案例 sl_socket_TX_FAILED_EVENT:
{
/*
* TX 失败
*
*将提供有关套接字描述符和状态的信息
*在'SockEventData_t'中可用-应用程序可以在以下情况下使用它
*必填
*
* slSockEventData_u * pEventData =空;
* pEventData =& pSock->socketOPAxINEVENT;
*
Switch( pSock->socket003.SockTxFailData.status )
{
案例 SL_ECLOSE:
cli_Write ("[sock event] close socket operation failed to transmit all queued packets \n\n");
中断;
默认值:
cli_Write ("[sock event] unexpected event \n\r");
中断;
}
}
中断;
默认值:
cli_Write ("[sock event] unexpected event \n\r");
中断;
}
}
/*
*异步事件处理程序--结束
*
/*
*应用程序的入口点
*
int main (int argc、char** argv)
{
_i32返回值=-1;
RetVal =初始化 AppVariables();
ASSERT_ON_ERROR (RetVal);
/*停止 WDT 并初始化 MCU 的系统时钟*/
stopWDT();
initClk();
/*配置命令行界面*/
cli_Configure();
displayBanner();
/*
*以下函数通过清除将器件配置为默认状态
*存储在 NVMEM (即连接配置文件&
*策略、电源策略等)
*
*如果开发人员确信,应用程序可能会选择跳过此步骤
*器件在应用程序开始时处于其默认状态
*
*请注意,在上完成的所有配置文件和持久设置
*设备将丢失
*
RetVal = configureSimpleLinkToDefaultState();
if (RetVal < 0)
{
如果(DEVICE_NOT IN_STATE_MODE = RetVal)
cli_Write("无法将设备配置为默认状态\n");
loop_forever ();
}
cli_Write (" Device is configured in default state \n"r);
/*
*初始化 CC3100设备
*假设器件已配置为站点模式
且处于默认状态
*
RetVal = sl_Start (0、0、0);
如果((RetVal < 0)||
(Role_STA!= RetVal))
{
cli_Write (" Failed to start the device \n\r");
loop_forever ();
}
cli_Write ("设备作为工作站启动\n");
/*配置源电子邮件*/
RetVal = setEmail();
if (RetVal < 0)
loop_forever ();
//连接到 WLAN AP */
RetVal =设置 ConnectionWithAP();
if (RetVal < 0)
{
cli_Write (" Failed to establish connection w/ an AP \n"r);
loop_forever ();
}
cli_Write ("通过 AP 建立连接并获取 IP \n\r\n);
/*配置并发送电子邮件*/
cli_Write ("正在发送电子邮件... \n\n");
RetVal = SendEmail();
如果(RetVal < 0)
{
cli_Write ("设备无法发送电子邮件\n");
loop_forever ();
}
其他
{
CLI_Write ("电子邮件已成功发送\n");
}
/*断开 AP 连接*/
RetVal = disconnectFromAP();
if (RetVal < 0)
{
cli_Write (" Failed to disconnect from the AP \n\r");
loop_forever ();
}
RetVal = sl_Stop (sl_stop_timeout);
if (RetVal < 0)
loop_forever ();
返回0;
}
/*!
\brief 此函数使用定义的参数配置源电子邮件
在"config.h"文件中
\param[in]无
\不返回任何内容
注意
警告
*
静态_i32 setEmail()
{
_i32返回值=-1;
SlNetAppSourceEmail_t sourceEmailId ={0};
SlNetAppSourcePassword_t sourceEmailPwd ={0};
SlNetAppEmailOpt_t eMailServerSetting ={0};
PAL_memcpy (sourceEmailId.Username、user、PAL_strlen (user)+1);
RetVal = sl_NetAppEmailSet (netapp_source_email、PAL_strlen (user)+1、
(_u8*)&sourceEmailId);
ASSERT_ON_ERROR (RetVal);
PAL_memcpy (sourceEmailPwd.Password、PASS、PAL_strlen (pass)+1);
RetVal = sl_NetAppEmailSet (NetApp_password、PAL_strlen (pass)+1、
(_u8*)&sourceEmailPwd);
ASSERT_ON_ERROR (RetVal);
eMailServerSetting.Family = AF_iNet;
eMailServerSetting.Port = Gmail_host_port;
eMailServerSetting.ip = sl_IPv4_VAL (74、125、129、108);
eMailServerSetting.SecurityMethod = SL_SO_SEC_METHOD_SSLv3_TLSv1_2;
//我们使用 sl_SO_SEC_METHOD_SSLv3和 SL_SO_SEC_METHOD_SSLv3_TLSv1_2更改了 SL_SO_SEC_METHOD_SSLv3
eMailServerSetting.SecurityCypher = SL_SEC_MASK_TLS_ECDHE_RSA_WIT_AES_128_CBC_SHA256;
//我们使用 SL_SEC_MASK_TLS_ECDHE_RSA_WITH_RC4_128_MD5和 SL_SEC_MASK_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256更改了 SL_SEC_MASK_SSL_RSA_WITH_RSA_WITH_RC4_ITH_128
// eMailServerSetting.SecurityMethod = sl_SO_SEC_METHOD_SSLv3;
// eMailServerSetting.SecurityCypher = sl_SEC_MASK_SSL_RSA_ITH_RC4_128_MD5;
RetVal = sl_NetAppEmailSet (netapp_advanced_opt、sizeof (SlNetAppEmailOpt_t)、
(_u8*)&eMailServerSeting);
ASSERT_ON_ERROR (RetVal);
返回成功;
}
/*!
\brief 将电子邮件发送到预配置的电子邮件 ID
\param[in]无
返回0表示成功,否则返回-1
注意
警告
*
静态_i32 SendEmail()
{
_i32状态=-1;
状态= sl_NetAppEmailSet (NetApp_dest_email、
PAL_strlen (destination_email)、
(_u8 *) destination_email);
ASSERT_ON_ERROR (状态);
状态= sl_NetAppEmailSet (NetApp_Subject、
PAL_strlen (email_subject)、
(_u8 *) email_subject);
ASSERT_ON_ERROR (状态);
状态= sl_NetAppEmailSet (NetApp_Message、
PAL_strlen (email_message)、
(_u8 *) email_message);
ASSERT_ON_ERROR (状态);
状态= sl_NetAppEmailConnect();
ASSERT_ON_ERROR (状态);
状态= sl_NetAppEmailSend();
ASSERT_ON_ERROR (状态);
返回成功;
}
/*!
此函数将 SimpleLink 器件配置为默认状态。 IT:
-将模式设置为电台
-将连接策略配置为“自动”和“自动 SmartConfig”
-删除所有存储的配置文件
-启用 DHCP
-禁用扫描策略
-将 Tx 功率设置为最大值
-将电源策略设置为正常
-取消注册 mDNS 服务
-删除所有过滤器
\param[in]无
成功返回、返回0。 出错时、返回负值
*
static _i32 configureSimpleLinkToDefaultState()
{
SlVersionFull ver ={0};
_WlanRxFilterOperationCommandBuff_t RxFilterIdMask ={0};
_u8 val = 1;
_u8 configOpt = 0;
_u8 configLen = 0;
_u8功率= 0;
_i32返回值=-1;
_i32模式=-1;
MODE = SL_Start (0、0、0);
ASSERT_ON_ERROR (MODE);
/*如果设备未处于站点模式,请尝试将其配置为站点模式*/
if (Role_STA!=模式)
{
如果(Role_AP =模式)
{
/*如果器件处于 AP 模式、我们需要等待该事件后再执行任何操作*/
while (!is_IP_Acquired (g_Status)){_SlNonOsMainLoopTask();}
}
/*切换到 STA 角色并重新启动*/
RetVal = sl_WlanSetMode (Role_STA);
ASSERT_ON_ERROR (RetVal);
RetVal = sl_Stop (sl_stop_timeout);
ASSERT_ON_ERROR (RetVal);
RetVal = sl_Start (0、0、0);
ASSERT_ON_ERROR (RetVal);
/*检查设备是否再次在站点中*/
if (Role_STA!= RetVal)
{
/*如果设备未在站点模式下启动,我们不想继续进行*/
ASSERT_ON_ERROR (DEVICE_NOT IN_STATE_MODE);
}
}
/*获取设备的版本信息*/
configOpt = sl_device_General_version;
configLen = sizeof (ver);
RetVal = sl_DevGet (sl_device_General_configuration、&configOpt、&configLen、(_u8 *)(&V));
ASSERT_ON_ERROR (RetVal);
//将连接策略设置为 Auto + SmartConfig (设备的默认连接策略)*/
RetVal = sl_WlanPolicySet (sl_policy_connection、sl_connection_policy (1、0、0、0、0、 1)、NULL、0);
ASSERT_ON_ERROR (RetVal);
/*删除所有配置文件*/
RetVal = sl_WlanProfileDel (0xFF);
ASSERT_ON_ERROR (RetVal);
/*
*处于站点模式的设备。 断开以前的连接(如果有)
*如果"已连接完成"、该函数返回0、如果已断开连接、则返回负数
*如果返回0、则等待'disconnection'事件、忽略其他返回代码
*
RetVal = sl_WlanDisconnect ();
if (0 =返回值)
{
/*等待*/
while (is_connected (g_Status)){_SlNonOsMainLoopTask();}
}
/*启用 DHCP 客户机*/
RetVal = sl_NetCfgSet (sl_IPv4_STA_P2P_CL_DHCP_ENABLE、1、&val);
ASSERT_ON_ERROR (RetVal);
/*禁用扫描*/
configOpt = sl_scan_policy (0);
RetVal = sl_WlanPolicySet (sl_policy_scan、configOpt、NULL、0);
ASSERT_ON_ERROR (RetVal);
/*设置工作站模式的 Tx 功率级别
介于0-15之间的数字、最大功率- 0的 dB 偏移将设置最大功率*/
功率= 0;
RetVal = sl_WlanSet (sl_WLAN_CFG_General_Param_ID、WLAN_General_Param_opt_STA_TX_POWER、1、(_u8 *)&POWER);
ASSERT_ON_ERROR (RetVal);
/*将 PM 策略设置为正常*/
RetVal = sl_WlanPolicySet (sl_policy_PM、sl_normal_policy、NULL、0);
ASSERT_ON_ERROR (RetVal);
/*取消注册 mDNS 服务*/
RetVal = sl_NetAppMDNSUnRegisterService (0、0);
ASSERT_ON_ERROR (RetVal);
/*删除所有64个过滤器(8*8)*/
PAL_Memset (RxFilterIdMask.FilterIdMask、0xFF、8);
RetVal = sl_WlanRxFilterSet (sl_remove_RX_filter、(_u8 *)&RxFilterIdMask、
sizeof (_WlanRxFilterOperationCommandBuff_t));
ASSERT_ON_ERROR (RetVal);
RetVal = sl_Stop (sl_stop_timeout);
ASSERT_ON_ERROR (RetVal);
RetVal =初始化 AppVariables();
ASSERT_ON_ERROR (RetVal);
返回 RetVal;/*成功*/
}
/*!
\brief 连接到 WLAN 接入点
此函数连接到所需的 AP (SSID_NAME)。
连接并获取 IP 地址后、该函数将返回
\param[in]无
成功时返回0、出错时返回负错误代码
注意
警告如果 WLAN 连接失败或我们未获取 IP 地址、
我们将永远停留在这个函数中。
*
static _i32建立连接扣缴()
{
SlSecParams_t secParams ={0};
_i32返回值= 0;
secParams.Key =密钥;
secParams.KeyLen = PASSKEY LEN;
secParams.Type = SEC_TYPE;
RetVal = sl_WlanConnect (SSID_NAME、PAL_strlen (SSID_NAME)、0、secParams、0);
ASSERT_ON_ERROR (RetVal);
/*等待*/
while ((!is_connected (g_Status)))||(!is_IP_Acquired (g_Status))){_SlNonOsMainLoopTask ();}
返回成功;
}
/*!
\brief 断开与 WLAN 接入点的连接
此函数与连接的 AP 断开连接
\param[in]无
\不返回任何内容
注意
警告如果 WLAN 断开连接失败、我们将永远无法使用此功能。
*
static _i32 disconnectFromAP()
{
_i32返回值=-1;
/*
*如果"已连接完成"、该函数返回0、如果已断开连接、则返回负数
*如果返回0、则等待'disconnection'事件、忽略其他返回代码
*
RetVal = sl_WlanDisconnect ();
if (0 =返回值)
{
/*等待*/
while (is_connected (g_Status)){_SlNonOsMainLoopTask();}
}
返回成功;
}
/*!
\brief 此函数初始化应用程序变量
\param[in]无
成功时返回0、出错时返回负错误代码
*
静态_i32初始化 AppVariables()
{
G_Status = 0;
返回成功;
}
/*!
\brief 此函数显示应用程序的横幅
\param 无
\无返回
*
静态空显示横幅()
{
cli_Write ("\n\n\r\n\r\n");
cli_Write (" Email application - Version ");
CLI_Write (application_version);
cli_Write ("\n\n\r\n********* \n\n");
}