NB-IoT 智慧路燈開(kāi)發(fā)

設(shè)備能力描述文件 profile 開(kāi)發(fā)
1)新增產(chǎn)品 設(shè)備的 Profile 文件是用來(lái)描述設(shè)備類型和設(shè)備服務(wù)能力的文件。定義了同一類設(shè)備具備的服務(wù)能力椭坚, 屬性予跌,命令等。
Step 1 登錄開(kāi)發(fā)者 Portal善茎,單擊“Profile 開(kāi)發(fā)>產(chǎn)品”券册,單擊頁(yè)面右上角的“自定義產(chǎn)品”,轉(zhuǎn)至“產(chǎn)品模板”頁(yè)面垂涯。
?您可以使用模板定義您的產(chǎn)品烁焙,單擊產(chǎn)品模板的“立即使用”,這里的參數(shù)需要根據(jù)您的設(shè)備進(jìn)行定義耕赘。
?您也可單擊右上角的“創(chuàng)建全新產(chǎn)品”骄蝇,直接定義您的產(chǎn)品,這里以創(chuàng)建全新產(chǎn)品為例操骡。

Step 2 根據(jù)實(shí)際填寫“設(shè)備類型”九火、“設(shè)備型號(hào)”、“廠商 ID”当娱、“廠商名稱”等數(shù)據(jù)吃既。單擊“確定”,添加產(chǎn)品完成跨细。

Step 3 在產(chǎn)品詳情頁(yè)面單擊“新建服務(wù)”鹦倚,根據(jù)界面提示信息,增加基本信息冀惭,屬性或命令震叙,單擊“保存”掀鹅。
? 新增服務(wù)基本信息,服務(wù)的名稱采用駝峰的命名方式媒楼,這里以 Light 為例乐尊。描述可選,有多個(gè)服務(wù)就新增多條服務(wù)划址。
2)新增屬性

3)新增命令 命令名稱:指示設(shè)備可以執(zhí)行的命令扔嵌。如門磁的 Lock 命令、攝像頭的 VIDEO_RECORD 命令

4)新增命令下發(fā)字段 命令名與參數(shù) 共同構(gòu)成一個(gè)完整的命令夺颤,在頁(yè)面上單擊“新增字段”痢缎。



完成設(shè)備能力描述文件 profile 開(kāi)發(fā)
設(shè)備數(shù)據(jù)編解碼中間件開(kāi)發(fā)(僅適用于與 NB-IoT 場(chǎng)景)
開(kāi)發(fā)完 Profile 文件后,可以在界面上通過(guò)圖形化的方式完成設(shè)備與平臺(tái)之間的消息映射世澜。在平臺(tái)中 預(yù)集成了編解碼插件的模板独旷,可以根據(jù)設(shè)備類型和接入?yún)f(xié)議在插件模板中選擇模板修改開(kāi)發(fā)編解碼插 件。 登錄開(kāi)發(fā)者 Portal寥裂,單擊“插件開(kāi)發(fā)”嵌洼,單擊右上角的“添加插件”,轉(zhuǎn)到“插件模板”頁(yè)簽封恰,單擊“查 看”麻养,您可以查看各個(gè)模板的內(nèi)容。 ? 若您的業(yè)務(wù)和模板中類似俭驮,可使用模板再根據(jù)實(shí)際來(lái)修改回溺。 ? 若您不需要使用模板,則可自己新建插件混萝。下面以新建插件來(lái)說(shuō)明如何開(kāi)發(fā)編解碼插件。使用模 板的類似修改即可萍恕。
  1. 新建插件
    Step 1 單擊上圖右上角的“新建插件”逸嘀,進(jìn)入設(shè)計(jì)插件頁(yè)面,選擇前面做的 Profile



    說(shuō)明:您可以單擊右上角的“新手指導(dǎo)”,查看插件的實(shí)現(xiàn)原理允粤。
    Step 2 新增數(shù)據(jù)上報(bào)消息崭倘。單擊“新增消息”,輸入消息的名稱类垫、描述和消息類型(這里選數(shù)據(jù)上

    報(bào))司光。

Step 3 添加字段。單擊“添加字段”悉患,添加上報(bào)數(shù)據(jù)的字段残家。



Step 4 新增命令下發(fā)消息。單擊“新增消息”售躁,輸入消息的名稱(這里以 Control 為例)坞淮、描述和 消息類型(這里選命令下發(fā))茴晋。
Step 5 添加字段。單擊“添加字段”回窘,添加命令下發(fā)的字段诺擅。 名字:本例以 Switch 例。 數(shù)據(jù)類型:本例為 string 例啡直。 長(zhǎng)度:本例均以長(zhǎng)度為 3 為例烁涌。 默認(rèn)值:該字段在碼流中的參考值。 偏移值:當(dāng)前字段到本條消息碼流起始位置的字節(jié)數(shù)酒觅,比如設(shè)置為 2-3撮执,則這個(gè)字段在碼流中的第 23 位。這個(gè)為插件設(shè)置自動(dòng)分配的
Step 5 建立 profile 屬性阐滩、命令與消息的映射關(guān)系二打。根據(jù)自己定義的 profile,來(lái)設(shè)計(jì)插件中的消 息掂榔。通過(guò)拖拉服務(wù)中的屬性或命令继效,與消息中的字段進(jìn)行關(guān)聯(lián)。屬性對(duì)應(yīng)于數(shù)據(jù)上報(bào)中的字段列表装获。 有多個(gè)服務(wù)就新增多個(gè)消息瑞信。為便于理解,字段名稱建議和屬性名設(shè)置為相同穴豫。
Step 6 完成映射關(guān)系后凡简,單擊頁(yè)面右上角的“部署”,部署成功后精肃,系統(tǒng)會(huì)將您的設(shè)計(jì)結(jié)果自動(dòng)生成編解碼插件包秤涩。


相關(guān)信息
IoT 平臺(tái)提供了設(shè)備模擬器,可以模擬真實(shí)設(shè)備發(fā)上來(lái)的消息碼流司抱,檢查插件包+profile 文件是否開(kāi)發(fā)正確筐眷。
Step 1 注冊(cè)模擬設(shè)備


應(yīng)用新增設(shè)備
開(kāi)發(fā)部署成功后,您可以將您的設(shè)備接入到 IoT 平臺(tái)习柠。
Step 1 登錄開(kāi)發(fā)者 Portal匀谣,單擊“我的設(shè)備”,進(jìn)入設(shè)備列表頁(yè)面资溃。單擊右上角的“注冊(cè)設(shè)備”武翎,轉(zhuǎn)向注冊(cè)設(shè)備頁(yè)面,選擇您需要注冊(cè)設(shè)備的 Profile溶锭。
Step 2 單擊 Profile宝恶,進(jìn)入 Profile 詳情頁(yè)面,在頁(yè)面底部填寫設(shè)備名稱和設(shè)備標(biāo)識(shí)碼,這里的設(shè)備名稱可以自己取卑惜,設(shè)備標(biāo)識(shí)碼為模塊上的 IMEI 號(hào)或者通過(guò) AT+CGSN=1 獲取膏执,單擊“注冊(cè)”,完成設(shè)備的 注冊(cè)露久。
南向設(shè)備開(kāi)發(fā)接入
前置條件
下載基于 LiteOS 的源碼: github.com/iot-club/EVB_M1_LiteOS
相關(guān)信息
設(shè)備接入方式:CoAP 非加密方式
AT 命令使用流程:
模組上電
設(shè)置CDP服務(wù)器地址 AT+NCDP=<ip_addr>[,<port>]
發(fā)送數(shù)據(jù) AT+NMGS=<length>,<data>
檢查是否 入網(wǎng)成功 AT+CGATT?
軟件重啟模組 AT+NRB
YES
NO
返回值等于1
300s后更米,AT+CGATT? 查詢返回值不等于1
相關(guān) API 調(diào)用流程:
初始化內(nèi)核 LOS_KernelInit();
創(chuàng)建傳感器數(shù)據(jù)采集任務(wù) creat_data_collection_task();
創(chuàng)建NB-IoT數(shù)據(jù)上報(bào)任務(wù) creat_data_report_task();
初始化模組 los_nb_init
注冊(cè)下發(fā)命令回調(diào)函數(shù) los_nb_notify
發(fā)送CoAP消息數(shù)據(jù) los_nb_report
采集光照強(qiáng)度數(shù)據(jù) Convert_BH1750
初始化硬件 HardWare_Init();
應(yīng)用開(kāi)發(fā)
串口助手 AT 命令對(duì)接平臺(tái)
這部分內(nèi)容是通過(guò)電腦串口調(diào)試軟件,手動(dòng)發(fā) AT 指令毫痕,直接發(fā)給 NB-IoT 模塊征峦。NB 模塊返回的信息, 直接到電腦串口調(diào)試軟件消请。一步一步動(dòng)手操作栏笆,實(shí)現(xiàn)連接 OceanConnect 平臺(tái)。采用的通訊協(xié)議是CoAP 協(xié)議臊泰。 Step 1 配置對(duì)接平臺(tái)地址
指令:AT+NCDP=<ip_addr>[,<port>] <ip_addr>:填寫平臺(tái)設(shè)備接入地址 <port>:填寫接入方式的端口號(hào)
例:AT+NCDP= 139.159.140.34,5683
Step 2 軟件重啟模組
指令:AT+NRB //配置完配置對(duì)接平臺(tái)地址后需要重啟模塊才能生效
REBOOTING
Step 3 檢查是否入網(wǎng)成功
指令:AT+CGATT?
+CGATT:1 //返回 1 表示入網(wǎng)成功蛉加,返回 0 入網(wǎng)失敗,300s 后依然為 0缸逃,則重啟模組
OK
Step 4 發(fā)送數(shù)據(jù)
指令:AT+NMGS=<length>,<data>
<length>:數(shù)據(jù)長(zhǎng)度 <data>:數(shù)據(jù)(十六進(jìn)制格式)
結(jié)果示例

LiteOS API 方式接入
這部分的通過(guò)單片機(jī)搭載華為 LiteOS 操作系統(tǒng)针饥,并移植了可兼容所有 AT 指令型的 AT 框架程序,調(diào)用 AT 框架的 API 接口實(shí)現(xiàn)快速連接華為 OceanConnect 平臺(tái)需频。并能實(shí)時(shí)接收平臺(tái)下發(fā)的命令丁眼,實(shí)現(xiàn)對(duì)設(shè)備的控 制,以下講解調(diào)用 API 實(shí)現(xiàn)的方式昭殉。
Step 1 分析主程序
int main(void)
{ UINT32 uwRet = LOS_OK;
HardWare_Init();
uwRet = LOS_KernelInit();
if (uwRet != LOS_OK)
{ return LOS_NOK; }
uwRet = creat_data_collection_task();
if (uwRet != LOS_OK)
{ return LOS_NOK; }
uwRet = creat_data_report_task();
if (uwRet != LOS_OK)
{ return LOS_NOK; }
LOS_Start(); }
主程序主要包括初始化硬件外設(shè)苞七、初始化內(nèi)核、創(chuàng)建傳感器數(shù)據(jù)采集任務(wù)挪丢、創(chuàng)建數(shù)據(jù)上報(bào)任務(wù)蹂风,接下來(lái)講
詳細(xì)講解主要部分的實(shí)現(xiàn)方式。
Step 2 初始化硬件
VOID HardWare_Init(VOID) { HAL_Init();
/* Configure the system clock /
SystemClock_Config();
/
Initialize all configured peripherals */
dwt_delay_init(SystemCoreClock);
MX_GPIO_Init();
MX_USART1_UART_Init();
printf("Welcome to IoT-Club, This is EVB-M1 Board.\r\n"); }
首先調(diào)用 HAL_Init() 初始化 HAL 庫(kù)乾蓬;SystemClock_Config()硫眨,用于系統(tǒng)時(shí)鐘的配置;再調(diào)用 MX_GPIO_Init() 初始化相應(yīng)的 GPIO巢块;最后初始化單片機(jī) debug 串口。
Step 3 創(chuàng)建傳感器采集任務(wù)
VOID data_collection_task(VOID)
{ UINT32 uwRet = LOS_OK;
short int Lux;
Init_BH1750();
while (1)
{
printf("This is data_collection_task !\r\n"); Lux=(int)Convert_BH1750();
printf("\r\n******************************BH1750 Value is %d\r\n",Lux);
sprintf(BH1750_send.Lux, "%5d", Lux);
uwRet=LOS_TaskDelay(1000);
if(uwRet !=LOS_OK) return; } }
這部分為傳感器數(shù)據(jù)采集部分巧号,首先是通過(guò) Init_BH1750() 函數(shù)初始化光照傳感器 BH1750 所對(duì)應(yīng)的單片機(jī) 管腳及傳感器族奢。
void Init_BH1750(void) { I2C_InitGPIO();
Cmd_Write_BH1750(0x01); }
通過(guò) Convert_BH1750() 函數(shù)采集傳感器數(shù)據(jù)
float Convert_BH1750(void)
{ Start_BH1750();
LOS_TaskDelay(180);
Read_BH1750();
result=BUF[0];
result=(result<<8)+BUF[1];
result_lx=(float)(result/1.2);
return result_lx; }
最后將傳感器數(shù)據(jù)以字符串的形式存入到數(shù)組中,用于發(fā)送到平臺(tái)上丹鸿。
sprintf(BH1750_send.Lux, "%5d", Lux);
Step 3 創(chuàng)建數(shù)據(jù)上報(bào)任務(wù)
VOID data_report_task(VOID)
{ UINT32 uwRet = LOS_OK;

define AT_DTLS 0

if AT_DTLS

sec_param_s sec;
sec.pskid = "868744031131026";
sec.psk = "d1e1be0c05ac5b8c78ce196412f0cdb0";

endif

printf("\r\nSTEP1: Init NB Module( NB Init )");

if AT_DTLS

los_nb_init((const int8_t)"180.101.147.115",(const int8_t)"5684",&sec); #else
los_nb_init((const int8_t)"180.101.147.115",(const int8_t)"5683",NULL);
los_nb_notify("+NNMI:",strlen("+NNMI:"),nb_cmd_data_ioctl,OC_cmd_match); LOS_TaskDelay(3000);
printf("\r\nSTEP3: Report Data to Server( NB Report )");
while(1) {
if(los_nb_report((const char*)(&BH1750_send),sizeof(BH1750_send))>=0) printf("ocean_send_data OK!\n");
else { printf("ocean_send_data Fail!\n"); }
uwRet=LOS_TaskDelay(1000); if(uwRet !=LOS_OK) return; } }
這部分程序主要包括連接平臺(tái)越走、注冊(cè)下發(fā)命令的回調(diào)函數(shù)以及上報(bào)數(shù)據(jù)到平臺(tái),以下將講解如何實(shí)現(xiàn)這三 部分。 1) 連接平臺(tái) 連接平臺(tái)的方式分為加密和非加密兩種廊敌,通過(guò)#define AT_DTLS 來(lái)實(shí)現(xiàn)連接方式的選擇铜跑,定義為 0 時(shí)為非 加密,此教程以非加密為例講解骡澈,實(shí)現(xiàn)程序如下

define AT_DTLS 0 #if AT_DTLS

sec_param_s sec; sec.pskid = "868744031131026";
sec.psk = "d1e1be0c05ac5b8c78ce196412f0cdb0";

endif printf printf("\r\nSTEP1: Init NB Module( NB Init )");

if AT_DTLS los_nb_init((const int8_t)"139.159.140.34",(const int8_t)"5684",&sec);

else los_nb_init((const int8_t)"139.159.140.34",(const int8_t)"5683",NULL);

此部分通調(diào)用 los_nb_init 函數(shù)初始化模組锅纺,等待連接網(wǎng)絡(luò),設(shè)置平臺(tái)對(duì)接地址實(shí)現(xiàn)對(duì)接平臺(tái)肋殴。三個(gè)參數(shù)分 別為設(shè)備對(duì)接 IP囤锉、設(shè)備對(duì)接端口以及加密的 PSK 碼。
int los_nb_init(const int8_t* host, const int8_t* port, sec_param_s* psk) { int ret; int timecnt = 0; //if(port == NULL) //return -1; at.init();
nb_reboot(); LOS_TaskDelay(2000); if(psk != NULL)//encryption v1.9
{
if(psk->setpsk) nb_send_psk(psk->pskid, psk->psk); else nb_set_no_encrypt(); }
while(1) { ret = nb_hw_detect(); printf("call nb_hw_detect,ret is %d\n",ret); if(ret == AT_OK) break; //LOS_TaskDelay(1000); } //nb_get_auto_connect(); //nb_connect(NULL, NULL, NULL);

while(timecnt < 120) { ret = nb_get_netstat(); nb_check_csq(); if(ret != AT_FAILED) { ret = nb_query_ip(); break; } //LOS_TaskDelay(1000); timecnt++; } if(ret != AT_FAILED) { nb_query_ip(); } ret = nb_set_cdpserver((char *)host, (char *)port); return ret; }

2) 注冊(cè)下發(fā)命令回調(diào)函數(shù) 注冊(cè)下發(fā)命令回調(diào)函數(shù)可實(shí)現(xiàn)對(duì)平臺(tái)下發(fā)命令的快速相應(yīng)并處理

los_nb_notify("+NNMI:",strlen("+NNMI:"),nb_cmd_data_ioctl,OC_cmd_match);

第一個(gè)參數(shù)為要匹配數(shù)據(jù)字段护锤,第二個(gè)參數(shù)為匹配字段的長(zhǎng)度官地、第三個(gè)參數(shù)為命令回調(diào)的執(zhí)行函數(shù)、第 四個(gè)為注冊(cè)字段的匹配函數(shù)烙懦。

int32_t nb_cmd_data_ioctl(void* arg, int8_t * buf, int32_t len) { int readlen = 0; char tmpbuf[1064] = {0}; if (NULL == buf || len <= 0)
{ AT_LOG("param invailed!"); return -1; } sscanf((char )buf,"\r\n+NNMI:%d,%s\r\n",&readlen,tmpbuf); memset(bc95_net_data.net_nmgr, 0, 30); if (readlen > 0) { HexStrToStr(tmpbuf, bc95_net_data.net_nmgr,readlen2); } AT_LOG("cmd is:%s\n",bc95_net_data.net_nmgr); if(strcmp(bc95_net_data.net_nmgr,"ON")==0) { HAL_GPIO_WritePin(Light_GPIO_Port,Light_Pin,GPIO_PIN_RESET); } if(strcmp(bc95_net_data.net_nmgr,"OFF")==0) { HAL_GPIO_WritePin(Light_GPIO_Port,Light_Pin,GPIO_PIN_SET); } /*******************************END**********************************************/ return 0; }

命令回調(diào)處理函數(shù)主要實(shí)現(xiàn)命令的解析以及實(shí)現(xiàn)控制相應(yīng)的設(shè)備驱入,此處以控制 LED 燈為例 int32_t OC_cmd_match(const char buf, char featurestr,int len)
{
if(strstr(buf,featurestr) != NULL) return 0; else return -1;
} 注冊(cè)字段匹配函數(shù)用于驗(yàn)證數(shù)據(jù)是否與注冊(cè)字段匹配/
3) 上報(bào)數(shù)據(jù) while(1)
{
if(los_nb_report((const char)(&BH1750_send),sizeof(BH1750_send))>=0)
printf("ocean_send_data OK!\n");
{ printf("ocean_send_data Fail!\n"); }
uwRet=LOS_TaskDelay(1000);
if(uwRet !=LOS_OK) return; } 上報(bào)數(shù)據(jù)調(diào)用的 API 為 los_nb_report 填入的參數(shù)為數(shù)據(jù)與數(shù)據(jù)長(zhǎng)度,這個(gè)函數(shù)里封裝了發(fā)送 coap 消息 的 AT 指令以及查詢發(fā)送的消息量的 AT 指令 int32_t nb_send_payload(const char
buf, int len)
{ char cmd1 = "AT+NMGS="; char cmd2 = "AT+NQMGS\r"; int ret; char str = NULL; int curcnt = 0; int rbuflen; static int sndcnt = 0; if(buf == NULL || len > AT_MAX_PAYLOADLEN) { AT_LOG("payload too long"); return -1; } memset(tmpbuf, 0, AT_DATA_LEN); memset(wbuf, 0, AT_DATA_LEN); str_to_hex(buf, len, tmpbuf); memset(rbuf, 0, AT_DATA_LEN); snprintf(wbuf, AT_DATA_LEN,"%s%d,%s%c",cmd1,(int)len,tmpbuf,'\r'); ret = at.cmd((int8_t)wbuf, strlen(wbuf), "OK", NULL,NULL); if(ret < 0) return -1; ret = at.cmd((int8_t*)cmd2, strlen(cmd2), "SENT=", rbuf,&rbuflen); if(ret < 0) return -1; str = strstr(rbuf,"SENT="); if(str == NULL) return -1; sscanf(str,"SENT=%d,%s",&curcnt,wbuf); if(curcnt == sndcnt) return -1; sndcnt = curcnt; return ret; }
程序編寫完后燒錄程序并打開(kāi)串口助手可看到以下結(jié)果
結(jié)果示例
日志輸出串口波特率為 115200


應(yīng)用平臺(tái)顯示數(shù)據(jù)
命令下發(fā)
? 回到設(shè)備列表氯析,進(jìn)入下發(fā)命令界面
設(shè)置 LED 下發(fā)控制命令亏较。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市魄鸦,隨后出現(xiàn)的幾起案子宴杀,更是在濱河造成了極大的恐慌,老刑警劉巖拾因,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旺罢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡绢记,警方通過(guò)查閱死者的電腦和手機(jī)扁达,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蠢熄,“玉大人跪解,你說(shuō)我怎么就攤上這事∏┛祝” “怎么了叉讥?”我有些...
    開(kāi)封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饥追。 經(jīng)常有香客問(wèn)我图仓,道長(zhǎng),這世上最難降的妖魔是什么但绕? 我笑而不...
    開(kāi)封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任救崔,我火速辦了婚禮惶看,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘六孵。我一直安慰自己纬黎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布劫窒。 她就那樣靜靜地躺著本今,像睡著了一般。 火紅的嫁衣襯著肌膚如雪烛亦。 梳的紋絲不亂的頭發(fā)上诈泼,一...
    開(kāi)封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音煤禽,去河邊找鬼铐达。 笑死,一個(gè)胖子當(dāng)著我的面吹牛檬果,可吹牛的內(nèi)容都是我干的瓮孙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼选脊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼杭抠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起恳啥,我...
    開(kāi)封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤偏灿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后钝的,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翁垂,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年硝桩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沿猜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碗脊,死狀恐怖啼肩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衙伶,我是刑警寧澤祈坠,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站矢劲,受9級(jí)特大地震影響颁虐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卧须,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧花嘶,春花似錦笋籽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至隘击,卻和暖如春侍芝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背埋同。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工州叠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凶赁。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓咧栗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親虱肄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子致板,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 家傳的佛珠,漆黑扎眼咏窿。有股檀香斟或。 母親交給他時(shí),他考上大學(xué)集嵌,正準(zhǔn)備上學(xué)萝挤。母親顫微微的遞給他時(shí),他感覺(jué)到無(wú)形的壓力纸淮。...
    邵村樹(shù)閱讀 721評(píng)論 0 1
  • 《房子不是隨便蓋的》第8期(收聽(tīng)節(jié)目點(diǎn)這里) 我國(guó)古代平斩,帝王都有求仙問(wèn)道的習(xí)慣。無(wú)論是秦皇漢武咽块,還是唐宗宋祖都參與...
    暢聽(tīng)旅行閱讀 651評(píng)論 0 0
  • 這兩天迷茫頹廢绘面,目光呆滯,困倦乏力侈沪,簡(jiǎn)直無(wú)法因果語(yǔ)言來(lái)形容揭璃! 前腳跟我說(shuō)完的事兒后腳就忘了!早上吃完飯亭罪,中午想...
    貓公主喵閱讀 221評(píng)論 1 1