#本片教程介绍了具体如何实现天猫精灵控制一个灯。

前提:

HASS平台

  1. 你已经搭建一个可以在公网IP访问到的HASS平台--- 我用的是租了阿里云服务器,买了个域名,ubuntu1604系统
  2. 你已经搭建一个可以在公网IP访问到的MQTT服务器----没有好的话也可以使用官方测试用的服务器凑合下
  3. 在HASS论坛注册一个账户和密码---- 一般人不给注册,你需要给管理员发送邮件证明你会基本的HASS搭建(这都不会玩个蛇)

天猫精灵

  1. 花60元在咸鱼买个二手的 天猫精灵-方糖  (官网89元新的)
  2. 下载天猫精灵手机APP,绑定自己的 天猫精灵-方糖

ESP8266模块

  1. 随便找个能够使用arduino ide 开发的ESP8266(这里使用的是  esp8266 d1 pro min  14元)
  2. 一个继电器,控制台灯开和关

运行服务器

  1. 远程登录阿里云服务器

2 为了防止关闭远程访问,而导致正在运行的程序跟着关闭,开启一个screen背后运行

首先查一下正在运行的screen

screen -ls

这里发现已经有一个背后运行的screen(里面是我之前开启的mqtt和hass程序)

screen -r 1102   # 查询指定编号的screen里运行的程序

然后来到 编号为1102的screen下面

  • 如果想创建一个也可以
  • screen -r 1102
  • exit
  • 执行完上面两句,代号1102的screen就被销毁了
  • screen -S hass_mqtt    #开启一个名字为hass_mqtt   的screen的背后运行
  • 所有在hass_mqtt   下面开启的程序不会随着远程访问断开而跟随关闭,会独立运行。

3运行 mqtt 服务器

上一步,我们已经来到 编号为1102的screen下面(或者你新建的screen下面)

进入 emqtt 文件路径下

cd Dongdong/emqttd

  

命令行进入路径,开启mqtt服务

./bin/emqttd start

  

  • ./bin/emqttd stop   关闭命令

4 运行hass

hass

  

回车开始运行

5 查看hass

打开谷歌游览器

输入   域名:8123

密码

看到自己的页面

图中是我默认添加的两个测试设备

一 HASS配置-发现灯设备

目的:告诉HASS平台,现在有一个新的设备---灯要被你控制管理

手动添加模式

0 打开配置文件手动配置HASS要连接的MQTT服务器

这里两个选择

一 蹭一下别人的mqtt服务器

二 直接在HASS的服务器上运行一个,这里我安装了EMQ版本的MQTT服务器,所以网址是本地的MQTT服务器  127.0.0.1:1883

# configuration.yaml配置样例
mqtt:
# MQTT Broker的IP地址或者域名,这里蹭的官网测试服务器
#broker: broker.mqtt-dashboard.com
#我在hass同一个服务器上,开了一个MQTT服务器
broker: 127.0.0.1
# MQTT Broker的端口号,缺省为1883
port: 1883
#client_id: home-assistant-1
# 用户名 不用设置
#username: homeassistant
# 密码 不用设置
#password: 123456

  

1 打开配置文件手动增加一个设备

platform: mqtt
name: "light_on"
state_topic: "hachina/rgb1/light/status"
command_topic: "hachina/rgb1/light/switch"
brightness_state_topic: "hachina/rgb1/brightness/status"
brightness_command_topic: "hachina/rgb1/brightness/set"
rgb_state_topic: "hachina/rgb1/rgb/status"
rgb_command_topic: "hachina/rgb1/rgb/set"
state_value_template: "{{ value_json.state }}"
brightness_value_template: "{{ value_json.brightness }}"
rgb_value_template: "{{ value_json.rgb | join(',') }}"
qos: 0
payload_on: "ON"
payload_off: "OFF"
optimistic: false

  手动添加的需要重启 hass服务。

自动添加模式

0 HASS配置要连接的MQTT服务器

1 HASS配置文件中开启自动发现设备。

# configuration.yaml配置样例
mqtt:
  # MQTT Broker的IP地址或者域名,这里蹭的官网测试服务器
  #broker: broker.mqtt-dashboard.com
  #我在hass同一个服务器上,开了一个MQTT服务器
  broker: 127.0.0.1
  # MQTT Broker的端口号,缺省为1883
  port: 1883
  #client_id: home-assistant-1
  # 用户名 不用设置
  #username: homeassistant
  # 密码  不用设置
  #password: 123456

  

  

2 ESP8266 WIFI模块(灯)发送自己的配置信息给HASS的配置话题。

hass配置话题 位置

homeassistant/light/garden/config

garden可以随意换--设备ID

发送的配置信息

{"name": "light_on", "command_topic": "hachina/rgb1/light/switch", "state_topic": "hachina/rgb1/light/status","brightness_command_topic": "hachina/rgb1/brightness/set", "brightness_state_topic": "hachina/rgb1/brightness/status","rgb_command_topic": "hachina/rgb1/rgb/set","rgb_state_topic": "hachina/rgb1/rgb/status","state_value_template": "{{ value_json.state }}","brightness_value_template": "{{ value_json.brightness }}","rgb_value_template": "{{ value_json.rgb | join(',') }}","optimistic": false}

  

  

 然后可以看到 HASS平台上多了一个灯   light_on(其他两个设备忽略)

light_on是我用esp8266自动注册的一个只有开关状态的灯

TestLed2_light_MQTT是我手动在配置文件中添加的灯,具备开关  颜色 亮度

上述两个灯除了名字不一样,其他接收开关的话题我设置成一摸一样。

可以直接用HASS来控制灯

手机HASS app

编辑--添加设备--里面有个我们自定义的灯设备 light_on--添加进来

短按开关,长按跳出颜色控制板块

下一步,接入天猫精灵,使用语音间接控制HASS的设备(HASS自带语音识别和播放服务,也可使用)

二 天猫精灵添加灯设备--将HASS上发现的灯设备添加到天猫精灵上,从而确保猫精间接通过HASS来控制灯

疑问: 为何猫精不直接控制灯?

世界灯种类千千万,鬼知道你这是什么灯,所以具体控制业务由专门开发智能家居的公司来搞,猫精只负责把语音控制解析信息给智能家居平台公司,由他们自己去控制自己平台下的灯。

1 登陆hass论坛,注册账户和密码

https://bbs.hassbian.com

2打开天猫精灵APP,在智能家居---绑定平台账号----绑定HASS账户和密码

这样猫精就和HASS这个具体的智能家居公司对接起来了(然而HASS不是一个公司,是一个开源项目,申请成为开发合作者)

3将HASS上已有的设备同步到天猫精灵手机APP-智能家居控制列表里,从而使得猫精间接通过HASS控制我们的灯

具体过程:

打开HASS论坛架设的配置网址

https://bbs.hassbian.com/tmall/discovery.php

输入自己的HASS地址和密码信息,进入自己的HASS设备管理

将第一步HASS发现的ID为 light_on的灯添加到天猫精灵设备管理中。

选择增加--真实设备

设置灯的信息

这里 天猫精灵看到hass上有三个设备

只具备 开关 不具备颜色 亮度支持

只具备 开关 不具备颜色 亮度支持

具备 开关 颜色 亮度

这里我们先添加个功能完全的

完成后,多出一个彩灯设备

打开天猫精灵APP,在智能家居中发现,多出一个彩灯设备(我已经在app里重新改名字,截图不是)

为了提高语音识别准确度,我按照天猫精灵APP的设置重新取了名字 --- 卧室的灯。

就这样,语音告诉猫精开灯,猫精解析语音后告诉HASS平台,去开哪盏灯。

-------------------------------------------------------------------------

hass是个智能家居管理平台,可以介入各种设备,具体怎么控制灯,这里需要借助MQTT通信协议和服务。

MQTT服务典型: 我想和女朋友说“我爱你”,并不是我直接告诉她,而是我在 “love”这个话题下,发布了“我爱你”这个消息,她订阅“love”话题,这样每次从“love”这个话题下,接收到“我爱你”的消息

这种服务好在哪: 凡是订阅这个话题的人,都能收到同样的消息,反之,也都可以往这个话题发消息。就像QQ和微信讨论组一样。

-------------------------------------------------------------------------

HASS接收到开哪个灯命令后,找到这个灯的信息,把开关,颜色,亮度控制命令通过MQTT放在指定话题上,等待灯来这个话题上取消息。

这个灯如何取到消息?

1能联网----这里选择ESP8266  wifi模块

2能使用MQTT--  esp8266 在 aruino ide开发平台 下有现成的MQTT通信库。使用这个库可以很轻易从对应话题拿到想要的数据。

3能当单片机控制-- ESP8266可以当一块单片机 开发,外接继电器可以控制220V的开和关。

三 对接现实世界------ESP8266程序

烧录时板型选择信息(根据自己使用的ESP866  wifi板类型)

两种控制模式:

1 使用HASS网页版或者手机APP直接控制

开关

亮度

颜色

2 天猫精灵语音控制hass,间接控制灯

天猫精灵 打开卧室的的灯

天猫精灵 关闭卧室的的灯

天猫精灵 将卧室的的灯颜色调成红色

天猫精灵 将卧室的的灯亮度调为60

ESP8266串口打印输出:

程序功能:

  1. 连接指定MQTT服务器
  2. 在hass约定好的配置话题上发送ESP8266自己的配置信息,从而HASS注册这个灯设备
  3. HASS注册设备后,将开灯关闭,颜色,亮度等控制信息发送到对应约定好的话题上,ESP8266wifi模块到对应话题取出命令,控制继电器开关台灯

未来扩展:

  1. 增加一键配网,可灵活修改WIFI信息
  2. 增加flash保存WIFI联网信息,断后电重新自动连接上次记录的WIFI信息
  3. 增加触摸开关,从而开关本身+HASS软件+天猫语音三者都能独立控制开关,同时彼此更新开关状态
  4. 完善电路,可控硅代替继电器,电路微薄化处理,做成玻璃面板,好看美观

目前bug

由于ESP本身内存小,无法发送太多信息。只能发送简单的开关

警告:

自动发现设备的时候,一定要改配置话题第三个参数ID,

  • 跟换设备名没关系。设备名重复,ID不重复,可以添加。
  • ID重复,不管设备名重复不重复,只能有一个

第一个设备 名字 RGBlight  ID garden   存在

homeassistant/light/garden/config

{"name": "RGBlight", "command_topic": "hachina/rgb1/light/switch",

第二个设备 名字light   ID garden1   存在

homeassistant/light/garden1/config

{"name": "light", "command_topic": "hachina/rgb1/light/switch",

第三个设备 名字light   ID garden2   存在

homeassistant/light/garden2/config

{"name": "light", "command_topic": "hachina/rgb1/light/switch",

第四个设备 名字light   ID garden    不存在

homeassistant/light/garden/config

{"name": "light", "command_topic": "hachina/rgb1/light/switch",

ID和第一个配置ID冲突,只能存在一个

esp8266烧录代码

/***************************************************

 ****************************************************/
#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h" /*-------------------------------------------------------------------------------------------
* 配置WIFI信息
*------------------------------------------------------------------------------------------*/ #define WLAN_SSID "dongdong"
#define WLAN_PASS "ldd123456" /*-------------------------------------------------------------------------------------------
* 配置MQTT服务器信息
*------------------------------------------------------------------------------------------*/ //#define AIO_SERVER "io.adafruit.com" // 不稳定
//#define AIO_SERVER "broker.mqtt-dashboard.com" // 稳定
#define AIO_SERVER "自己的mqtt服务器地址"
#define AIO_SERVERPORT 1883 // use 8883 for SSL
#define AIO_USERNAME ""
#define AIO_KEY "" /*-------------------------------------------------------------------------------------------
* 配置外接设备
*------------------------------------------------------------------------------------------*/
// 灯的接口 D4口-继电器
int Light_d1 = D4; /*-------------------------------------------------------------------------------------------
* 开启MQTT服务
*------------------------------------------------------------------------------------------*/ // Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client; // Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_USERNAME, AIO_KEY); /*-------------------------------------------------------------------------------------------
-由于MQTT发布信息有长度限制 130个左右,不能一次性发送太多自身配置信息,因此发杂的设备无法注册
*/ // 发送自身配置信息 开关
// 名字
String name_s="light_on";
// 接收开关命令话题
String command_topic_s="hachina/rgb1/light/switch";
// 自身开关状态发布话题
String state_topic_s = "hachina/rgb1/light/status";
// 接收亮度命令话题
String brightness_command_topic_s="hachina/rgb1/brightness/set";
// 自身亮度发布话题
String brightness_state_topic_s="hachina/rgb1/brightness/status";
// 接收颜色命令话题
String rgb_command_topic_s="hachina/rgb1/rgb/set";
// 自身颜色状态发布话题
String rgb_state_topic_s="hachina/rgb1/rgb/status";
// 话题可以性
String optimistic_c="false"; // 可用1 注册一个只有开关的灯 没有亮度和颜色
String my_config_s=
String("{\"name\":\"")+ name_s
+String("\",\"command_topic\":\"")+command_topic_s
+String("\",\"state_topic\":\"")+state_topic_s
//+String("\",\"brightness_command_topic\":\"")+brightness_command_topic_s
//+String("\",\"brightness_state_topic\":\"")+brightness_state_topic_s
//+String("\",\"rgb_command_topic_topic\":\"")+rgb_command_topic_s
//+String("\",\"rgb_state_topic\":\"")+rgb_state_topic_s
+String("\",\"optimistic\":\"")+optimistic_c
+String("\"}"); String hass_config_s1="homeassistant/light/garden/config"; // 发布自己的配置信息
Adafruit_MQTT_Publish hass_config = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "homeassistant/light/garden/config"); // 发布自己的开关信息
Adafruit_MQTT_Publish state_topic = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "hachina/rgb1/light/status"); //发布自己的亮度信息
Adafruit_MQTT_Publish brightness_state_topic = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "hachina/rgb1/brightness/status"); //发布自己的颜色信息
Adafruit_MQTT_Publish rgb_state_topic = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "hachina/rgb1/rgb/status"); /*-------------------------------------------------------------------------------------------
* 功能:订阅开关信息
* 输入:颜色数据
* 输出:空
*------------------------------------------------------------------------------------------*/ //订阅开关命令
Adafruit_MQTT_Subscribe command_topic = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "hachina/rgb1/light/switch", MQTT_QOS_1);
//订阅亮度命令
Adafruit_MQTT_Subscribe brightness_command_topic = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "hachina/rgb1/brightness/set", MQTT_QOS_1);
//订阅颜色命令
Adafruit_MQTT_Subscribe rgb_command_topic = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "hachina/rgb1/rgb/set", MQTT_QOS_1); /*************************** 接受信息订阅函数 ************************************/ /*-------------------------------------------------------------------------------------------
* 功能:接收开关命令回掉函数
* on 开灯 off 关灯
* 输入:接收数据+数据长度
* 输出:空
*------------------------------------------------------------------------------------------*/
void command_topic_call(char *data, uint16_t len) {
Serial.print("the button value is: ");
Serial.println(data); String msg=String(data); if(msg=="ON") { Serial.println("light is open");
digitalWrite(Light_d1, HIGH); if (! state_topic.publish("ON")) {
Serial.println(F("state_topic.publish Failed"));
} else {
Serial.println(F("state_topic.publish ON!"));
} } if(msg=="OFF") { Serial.println("light is close");
digitalWrite(Light_d1, LOW); if (! state_topic.publish("OFF")) {
Serial.println(F("state_topic.publish Failed"));
} else {
Serial.println(F("state_topic.publish OFF!"));
} } }
/*-------------------------------------------------------------------------------------------
* 功能:接收亮度命令回掉函数
* 向电脑打印输出亮度值 0-255
* 输入:亮度数据
* 输出:空
*------------------------------------------------------------------------------------------*/
void brightness_command_topic_call(double x) {
Serial.print("Hey we're in a slider callback, the slider value is: ");
Serial.println(x); if (! brightness_state_topic.publish(x)) {
Serial.println(F("brightness_state_topic.publish Failed"));
} else {
Serial.print(F("brightness_state_topic.publish "));Serial.println(x);
} }
/*-------------------------------------------------------------------------------------------
* 功能:接收颜色命令回掉函数
* 向电脑打印输出亮度值 255,255,255
* 输入:颜色数据
* 输出:空
*------------------------------------------------------------------------------------------*/
void rgb_command_topic_call(char *data, uint16_t len) {
Serial.print("the button value is: ");
Serial.println(data); } void setup() { pinMode(Light_d1, OUTPUT);
digitalWrite(Light_d1, LOW); Serial.begin(115200);
delay(10); Serial.println(F("Adafruit MQTT demo")); // Connect to WiFi access point.
Serial.println(); Serial.println();
Serial.print("Connecting to ");
Serial.println(WLAN_SSID); WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(); Serial.println("WiFi connected");
Serial.println("IP address: "); Serial.println(WiFi.localIP()); // 配置信息转换
// strcpy( my_config_c, my_config.c_str()); // 回掉函数
command_topic.setCallback(command_topic_call);
brightness_command_topic.setCallback(brightness_command_topic_call);
rgb_command_topic.setCallback(rgb_command_topic_call);
// 订阅话题注册 mqtt.subscribe(&command_topic);
mqtt.subscribe(&brightness_command_topic);
mqtt.subscribe(&rgb_command_topic); } uint32_t x=0; void loop() { MQTT_connect(); // this is our 'wait for incoming subscription packets and callback em' busy subloop
// try to spend your time here:
mqtt.processPackets(10000); // ping the server to keep the mqtt connection alive
// NOT required if you are publishing once every KEEPALIVE seconds if(! mqtt.ping()) {
mqtt.disconnect();
}
} // Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
int8_t ret; // Stop if already connected.
if (mqtt.connected()) {
return;
} Serial.print("Connecting to MQTT... "); uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 3 seconds...");
mqtt.disconnect();
delay(3000); // wait 10 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
while (1); // ESP.wdtFeed();
}
}
Serial.println("MQTT Connected!"); hass_config.publish(my_config_s.c_str());
// 内存不够大 ,一直重启 只能注册个简单的有开关功能
Serial.println(my_config_s); }

  

程序烧录后,ESP一直触发看门狗重启,是MQTT库默认允许发送数据最大长度引起的.

打开mqttq库文件源代码,修改。

注意修改 esp8266  mqtt库允许发送最大的 数据长度(默认 150),修改为1024

然后还是没什用,报错 但是最大只能传送约 130个char

这意味着通过MQTT自动配置,只能发送 开关的信息,颜色和亮度信息发送不了。需手动添加,后者使用手机MQTT调试助手发过去,长度最大限制1024。

(二 -3-1) 天猫精灵接入Home Assistant-自动发现Mqtt设备--灯系列 实战的更多相关文章

  1. (二 -3-1) 天猫精灵接入Home Assistant-自动发现Mqtt设备--灯系列 esp8266程序

    设备1 上电自动注册自己是个1个开关 HASS网页和手机APP控制 外部开关上升沿中断控制 天猫精灵语音控制 一键配网 记录以往WIFI信息 设备2 上电后,自动注册自己有三个开关控制 HASS网页和 ...

  2. (二 -3) 天猫精灵接入Home Assistant-自动发现Mqtt设备--灯系列

    参考网站 1该mqtt光平台可以让您控制您的MQTT启用灯.它支持设置亮度,色温,效果,闪烁,开/关,RGB颜色,过渡,XY颜色和白色值. https://www.home-assistant.io/ ...

  3. (二 -4) 天猫精灵接入Home Assistant-自动发现Mqtt设备--传感器系列

    https://www.home-assistant.io/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt/ 最 ...

  4. (二 -5) 天猫精灵接入Home Assistant-自动发现Mqtt设备--电风扇

    官网:https://www.home-assistant.io/components/fan.mqtt/ 1 添加配置文件 要在安装中启用MQTT风扇,请将以下内容添加到您的configuratio ...

  5. (二 -3-3) 天猫精灵接入Home Assistant-自动发现Mqtt设备-自动生成配置信息

    http://www.hassmart.com/products/switches/#tab=config switch: - platform: mqtt name: keting state_to ...

  6. (二 -2) 天猫精灵接入Home Assistant-自动发现Mqtt设备

    参考中文教程:  https://www.hachina.io/docs/7230.html 英文官网 两个温度传感器:https://www.home-assistant.io/docs/mqtt/ ...

  7. (二 -1) 天猫精灵接入Home Assistant-控制Mqtt设备

    关于hass对接mqtt 请参考官网 https://www.hachina.io/docs/7083.html 1 登陆运行着hass的阿里云服务器 2 修改hass配置文件,添加mqtt服务信息 ...

  8. (二 -0) 天猫精灵接入Home Assistant-安装MQTT服务器

    ubuntu 1604  阿里云 学生版轻型服务器 1 安装MQTT 进入官网 http://emqtt.com/ 点击下载 找到  ubuntu 1604  右键-复制链接 粘贴办理内容是下载链接第 ...

  9. (四) 天猫精灵接入Home Assistant-ESP-WIFI模块通过mqtt协议接入HASS

    总过程 1 ESP8266上电后,初始化 连接MQTT服务器 发布自身配置信息----hass自动发现该设备 订阅hass的命令话题---接收命令 发布hass的状态话题---返回自身状态 2 ESP ...

随机推荐

  1. es6 set

    ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. const setset = new Set([1, ...

  2. K8S RBAC

    API Server 内部通过用户认证后,然后进入授权流程.对合法用户进行授权并且随后在用户访问时进行鉴权,是权限管理的重要环节. 在 kubernetes 集群中,各种操作权限是赋予角色(Role ...

  3. HTML5中的input type为file控件限制上传文件类型及扩展

    简单介绍 input file控件限制上传文件类型如下:1.文件类型中间用,分开:2.html和htm这样的要写成两个: 3实例: <input type="file" na ...

  4. viewPager+fragment如何刷新缓存fragment

    最近在做一个项目,有一个功能是答题翻页.于是需要实现在这一页的时候就缓存下一页. 刚刚开始我是用 setOnPageChangeListener方法监听,滑到这一页的时候才刷新这一页: public ...

  5. 环信easeui集成:坑总结2018(二)

    环信EaseUI 集成,集成不做描述,看文档即可,下面主要谈一些对easeui的个性化需求修改. 该篇文章将解决的问题: 1.如何发送视频功能 2.未完待续.. ------------------- ...

  6. 添加/删除/修改Windows 7右键的“打开方式”

    右键菜单添加/删除"打开方式" 此"打开方式"非系统的"打开方式",二者可以并存. 右键菜单添加"打开方式" 在HKEY ...

  7. Linux 中提高的 SSH 的安全性

    SSH 是远程登录 Linux 服务器的最常见的方式.且 SSH 登录的时候要验证的,相对来讲会比较安全.那只是相对,下面会介绍一些方式提高 SSH 的安全性 SSH 的验证 而SSH 登录时有两种验 ...

  8. Spark操作parquet文件

    package code.parquet import java.net.URI import org.apache.hadoop.conf.Configuration import org.apac ...

  9. SAP 维护视图创建与修改

    维护视图创建与修改 维护视图创建 T-CODE:SE54 维护ABAP数据字典 维护已生产的对象 注意:当维护视图修改后,需要删除已生成的对象,重新创建已生成的对象,否则无法显示,这个小窍门我花了半天 ...

  10. SQLServer数据库增删改查

    一.数据库定义 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库.数据库的操作分为两种形式:一种是直接在数据库管理工具图形化界面进行操作:一种是使用数据库脚本进行操作,数据库脚本可 ...