|
Good Year to all,
I have a question and your help would be important. I am creating a graphical interface (C #) that communicates via IP with a relay module.
I am having difficulty sending the IP commands to turn the Relays off and on.
The command must include IP address / Password / command: example - 192.168.1.4/30000/00
Relay 1-8 Bit Command:
http: // IP / password / 00: Relay-01 OFF
http: // IP / password / 01: Relay-01 ON
The command must be sent all of it at once.
Thank you very much
|
|
|
|
|
Hi,
setting up a communication between two devices may be hard to bootstrap; if at first it doesn't work you typically have too little information to figure which side is failing and what should be done to remedy the problem.
However if your target device already exists, and expects HTTP GET commands (as your post suggests), then you should be able to test it from any browser, e.g. Google Chrome.
Mind you, the peripheral when receiving a GET command, is normally expected to return some web page, i.e. some data that has this structure:
<html>
<head>
... the head may be empty
</head>
<body>
... some meaningful text goes here
... counter = 102 (*)
</body>
</html>
it is wise to take care of that right away, as it will help you in debugging the system.
(*) I would also suggest to include a counter value, so each time a page is returned it is different from the previous one, in a predictable way.
Similarly I also suggest you give your peripheral an observable something, say an LED that toggles each time a page request is received (that is a one-bit counter!).
Now I see some potential problems:
1. your "command" is passed entirely as one of many possible web page URLs, and it seems to contain spaces, which are not allowed in a URL (i.e. they should be escaped, this turns every space into the sequence "%20")
I find it easier to avoid all special characters, including spaces.
2. I would prefer to work with only one page, and pass all the details (relay number, relay state) and even the password as parameters; parameters are key-value pairs, starting with a question mark and separated by ampersands, so it might look like:
http:
3. Depending on what devices and networks might sit between your PC and your peripheral, there may be a risk of your command never reaching your peripheral, due to caching somewhere on the way. This can be remedied by some META tags in the HTML head (very tricky to get a general solution), or by adding an extra parameter which is always different, like:
http:
As the URL of consecutive commands would all be different (having an incrementing sequence number), caches can not intervene.
4. You should be aware that an HTTP command may reach your peripheral (a) not at all (internet offers no guarantees), (b) just once, (c) many times. A browser is allowed to automatically resend a command that didn't get answered soon enough. So the concept of your peripheral and its command language must allow for unintended command duplication.
A safer way is to use an HTTP POST command rather than the standard HTTP GET command. This too can be achieved through a browser (e.g. there are extensions to Chrome for this purpose).
Once you got all the above up and running fine, you can try and create C# code that replaces your browser. There are at least two ways to handle this:
1. using a WebBrowser [^] Control, which basically is the kernel of Internet Explorer with an API so you can set the URL and request a page, view it, etc. When you're done debugging, the WebBrowser can remain off-screen or be otherwise invisible.
2. using some classes from the System.Net namespace, such as HttpWebRequest[^]. I suggest you google for some examples.
Hope this helps
modified 4-Jan-19 21:58pm.
|
|
|
|
|
How to send meeting invitation to an user using google calendar API and invitation send by email?
|
|
|
|
|
Check the Google API documentation.
|
|
|
|
|
|
I was debugging a Class that uses a Stack, and seeing puzzling results ... in terms of Stack contents ... when I realized a public read-only Property 'getter was using 'Pop: so, every time I inspected an instance of the Class in break-mode, the Stack was popped.
I was wondering if there is a compiler directive, or other means. to detect Class instance state being accessed in break mode, and block the 'Pop. My searches have not found an answer, yet.
thanks, Bill
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
|
|
|
|
|
Popping an item off a stack is a run-time instruction; how could the compiler prevent that occurring? And that instruction should only execute in break mode if you step through it. I think we need more details.
|
|
|
|
|
thanks, Richard,
Keep in mind that I have set a break-point, and I am "opening" the current state of the Class instance to browse it by hovering over the source code using the IDE's inspector to view the current values of variables, and properties. So, there is a level of indirection in the code execution here.
My (weak) hypothesis that run-time break mode and instance drill-down detection in VS may be possible is based on the assumption that there's always something possible I don't know
cheers, Bill
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
modified 4-Jan-19 4:45am.
|
|
|
|
|
I have been debugging my (sometimes poorly designed) code with Visual Studio for years, and I have never had an occasion where inspecting a variable makes it change value.
|
|
|
|
|
Quite likely because you had the common sense to never pop a value off a stack ... and return the popped value ... in a property getter
Or, if you did that, and set a break-point and then inspected the class instance ... you weren't perturbed by the inspection calling the getter, and you were not crazy enough to imagine Visual Studio might provide a way during paused program execution to look around without side-effects.
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
|
|
|
|
|
I cannot imagine how this is happening. Inspecting variables should not disturb them. The whole point of the debugger is that nothing changes unless you tell it to.
modified 4-Jan-19 12:38pm.
|
|
|
|
|
A getter property isn't a variable and doesn't have a value, it is a bunch of code that returns a value, so yes when asked for it will execute whatever code is present. That is good enough reason not to create side effects in a getter property.
|
|
|
|
|
Yes, of course it is, something I need to test.
|
|
|
|
|
Hi Bill,
a getter should not change object state, reading a property isn’t allowed to change anything.
That is why Random.Next is a method, not a property.
|
|
|
|
|
Thanks, Luc, Are you saying that a Property 'getter can't change anything, or are you expressing your opinion that a 'getter should not change anything ?
The issue here is the side-effect of browsing class instance values during a "break-state."
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
|
|
|
|
|
a getter's role must be restricted to returning information about the object, it should not modify the state of an object, nor have any other side effects.
IMO a getter with side effects would breach OOP principles.
MSDN[^] states: "It is a bad programming style to change the state of the object by using the get accessor".
|
|
|
|
|
I always appreciate your opinions, Luc !
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
|
|
|
|
|
|
Thanks, Richard ! I have 'come around' to thinking that the Property should be replaced by a Method whose name makes it obvious what state will be changed. And, maybe I shouldn't be surprised at the side-effect of a 'getter whose value is inspected during a 'break state !
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
|
|
|
|
|
You can know if a debugger is attached with
System.Diagnostics.Debugger.IsAttached
but you can't really know if the code is executed by the debugger. I think.
On another topic, such side effect of simply reading a property seems.. ill advised...
|
|
|
|
|
Thanks, LLoyd, that's a valuable thing to know about !
When you inspect a class instance in break-mode, you have, evidently, no way to prevent a specific public property 'getter from being called. Using 'IsAttached in code will work when you are running the release compiled .exe. In my experiments, running from within VS, using 'release mode, ;IsAttached is always 'true.
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
|
|
|
|
|
we are working on POS System which is running based on server database but if internet is being disconnected then we need to use local system to store data entry and we r using SQL server database on server machine but we don't have sql server management studio is installed on local system. so how can we sync data from local system to server database ???
|
|
|
|
|
This is more of an architectural issue than a pure C# issue. Basically, you are going to need some form of synchronization framework (Microsoft supplied on called the SyncFramework a while back but this is largely an unsupported OS project now). The reason that this is an architectural issue is because you are going to need to put rules in place to decide how you want to handle the merge of data back. For instance, suppose you have sold some items and placed the order locally, but the master database now says that you don't have enough of that item to fulfill the order; what are you going to do?
This space for rent
|
|
|
|
|
Hi,
I am very much new to the csharp. In one application there a List control is present in a grid. I need to drop down the list control(this is sync fusion list control) items and show it with a enter key stroke. Please suggest
|
|
|
|
|